创建字符指针向量以指向字符串向量

Posted

技术标签:

【中文标题】创建字符指针向量以指向字符串向量【英文标题】:creating vectors of character pointers to point to vector of strings 【发布时间】:2012-06-13 23:14:54 【问题描述】:

我有一个字符串向量:vectorElements 我想创建一个 *char 向量来指向每个字符串的开头。我的目标是能够逐个字符地遍历每个字符串。最终,我想对字符串向量进行排序。 注意:字符串可能包含整数值。在这种情况下,我将根据它们的数值进行排序。

【问题讨论】:

你会用 C++ 写代码吗?还是必须用 C 代码编写? 我有点不清楚你的问题到底是什么。您能否发布一个您拥有的代码示例,可能带有您不知道如何创建的部分的注释存根? 【参考方案1】:

如果您使用 C++ 编写,最好使用 C++ string 而不是 char 的 C 样式数组。您仍然可以通过使用begin() 获取迭代器并在迭代器上使用重载运算符++ 来遍历每个字符以遍历到下一个字符(检查end() 返回的迭代器以了解您是否到达字符串的末尾或不)。您还可以使用重载运算符 [] 引用 C 风格的字符串中的字符。

因此,vector<string> 可能是您需要的。

要对字符串进行排序,您可能需要在 algorithm 标头中使用 sort 函数。由于您不是一直按词法对它们进行排序,因此您必须定义自己的函数来比较两个字符串。

伪代码进行比较:

while (i < str1.length() && i < str2.length())
  if (!isDigit(str1[i]) || !isDigit(str2[i]))
    // Lexical comparison
    if (str1[i] != str2[i])
      i++
    else
      return str1[i] < str2[i]
  else // If both are digits
    // parseInt will parse the number starting from current position
    // as positive integer
    // - It will consume as many characters as possible (greedily) and
    // return the parsed number plus the number of characters consumed
    // - If the number is very large (exceed 64-bit), you may want to 
    // only find the length of the number and write another
    // comparison function for big numbers.
    // The code below assumes no overflow
    (num1, len1) = parseInt(str1, i)
    (num2, len2) = parseInt(str2, i)
    if (num1 == num2)
      i += len1
    else
      return num1 < num2

if (str1.length() == str2.length())
  return false
else
  return str1.length() < str2.length()

【讨论】:

【参考方案2】:

您可以使用std::sort。

for ( int i=0; i<vec.size(); ++i )

    std::string & str = vec[i];
    std::sort(str.begin(), str.end());

Demo

【讨论】:

您需要包含一个自定义比较器,以满足 OP 对“包含数值”的字符串以不同于默认字典排序的方式处理的愿望。

以上是关于创建字符指针向量以指向字符串向量的主要内容,如果未能解决你的问题,请参考以下文章

向量中不存在 C++ 字符串成员变量

C ++如何使用指向向量指针的指针

C++ 通过引用传递向量字符指针

字符串, 向量和数组 术语表

如何在字符串向量中指向 const int?

如何将字符串添加到 C++ 中无序映射中的字符串向量