【问题标题】:Accessing a char in a vector of strings by its iterator通过迭代器访问字符串向量中的字符
【发布时间】:2015-01-13 10:50:20
【问题描述】:

这是我的代码的一部分:

std::vector<std::string> syntax_words;
//...
//Currently the above vector contains few strings
std::vector<std::string>::iterator sy_iterator = syntax_words.begin(); 

while (sy_iterator != syntax_words.end(){
    if (*sy_iterator[4] == 'X'){
//...

基本上我想访问当前字符串中的第五个字符。不幸的是,上面的代码在编译过程中抛出了一个错误:

error: no match for ‘operator*’ (operand type is ‘std::basic_string<char>’)
      if (*sy_iterator[4] == 'X'){

我也试过这个:

if (sy_iterator[4] == 'X'){

但它也抛出一个错误:

error: no match for ‘operator==’ (operand types are ‘std::basic_string<char>’ and ‘char’)
      if (sy_iterator[sit] == 'X'){

我应该怎么做才能让它工作?

【问题讨论】:

  • 优先,优先,优先……你的意思是(*sy_iterator)[4](或者,等效地,sy_iterator-&gt;operator[](4))。
  • 运算符优先级,试试if ((*sy_iterator)[4] == 'X'){)
  • @TheParamagneticCroissant 哦,谢谢。我忘记了。
  • @user3125731 即使您忘记了它(因为谁能记住所有优先级?)从编译器错误消息中推断出来也很简单。
  • @TheParamagneticCroissant 你完全正确。我不知道为什么我没有自己想出解决方案。也许是因为我有点累了。

标签: c++ string vector iterator


【解决方案1】:

试试下面的

while ( sy_iterator != syntax_words.end() )
{
    if ( sy_iterator->size() > 4 && ( *sy_iterator )[4] == 'X')
    {
        //...

您的原始代码 sn-p 的问题与运算符的优先级有关。后缀运算符 [] 的优先级高于一元运算符 *。因此这个表达式

*sy_iterator[4]

等价于

*( sy_iterator[4] )

表达式sy_iterator[4] 将产生一个由迭代器sy_iterator + 4 指向的字符串,您正尝试将运算符* 应用到该字符串。但是类字符串没有运算符 *。所以编译器会报错。

至于这个说法

if (sy_iterator[4] == 'X'){

然后在这里您尝试将迭代器sy_iterator + 4 与字符文字'X' 进行比较。因为没有从比较的一个操作数到另一个操作数的这种隐式转换,所以编译器也会发出错误。

考虑到类 std;:vector 具有随机访问迭代器,例如表达式

syntax_words.begin() + 4

将产生与成员函数 begin() 返回的迭代器相关的第四个迭代器。

【讨论】:

    【解决方案2】:

    你可以这样:
    DEMO

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
        // your code goes here
            std::vector<std::string> syntax_words;
            syntax_words.push_back("urs X is here");
        for (string str : syntax_words){
          if(str.size() > 5 && str.at(4) == 'X')
            cout << "found" << endl;
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 2021-04-01
      • 1970-01-01
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2012-02-24
      • 1970-01-01
      相关资源
      最近更新 更多