【问题标题】:Getting position of char in vector (C++)获取向量中字符的位置(C++)
【发布时间】:2016-11-29 15:18:16
【问题描述】:

我正在尝试检查字符向量中是否存在字符,如果存在,则获取它的编号。我已经完成了第一部分(检查 char 是否存在):

char letter(a);
string word;
vector<char>vWord(word.begin(), word.end());
if(find(vWord.begin(), vWord.end(), letter) != vWord.end()){}    

但我不知道如何获得这个职位。任何帮助表示赞赏。

【问题讨论】:

  • 你可以简单地使用std::string::find,它会返回索引
  • int index = std::find(vWord.begin(), vWord.end(), letter) - vWord.begin();
  • @KarstenKoop:你应该这样回答。

标签: c++ string vector char


【解决方案1】:

保存迭代器并对其进行一些数学运算:

vector<char>::iterator itr = find(vWord.begin(), vWord.end(), letter);
if(itr != vWord.end())
{
   int index = itr - vWord.begin();
}

但是请注意std::string 已经有一个find 方法。

【讨论】:

    【解决方案2】:

    你快到了。您已经有一个指向该字符的迭代器(由find 返回),因此您可以使用std::distance 来查找距离:

    char letter(a);
    string word;
    vector<char>vWord(word.begin(), word.end());
    auto it = find(vWord.begin(), vWord.end(), letter);
    if (it != vWord.end())
    {
      size_t index = std::distance(vWord.begin(), it);
    }
    

    对于随机访问迭代器(例如 std::vector 使用的那些),std::distance(a, b) 是一个常量时间操作,通过执行 b - a 来实现。

    旁注:您可以直接对std::string 进行std::find 和迭代器操作;它本身就是一个完美的容器。

    【讨论】:

    • 古老的使用-std::distance
    • 你应该使用auto,而不是size_t。在问题提出的场景中,这可能不是问题,但std::distance 的某些用法可以返回负数,而迭代器的difference_type 可能是有符号整数。
    • @Xirema 在 this 的情况下,std::distance 不可能返回负数,并且在size_t 以外的类型的容器中具有索引可能有其自身的问题在路上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多