【问题标题】:Can you use advance() in a string::iterator in C++?你可以在 C++ 中的 string::iterator 中使用 advance() 吗?
【发布时间】:2014-09-16 00:11:26
【问题描述】:
        for( string::iterator it = line.begin(); it != line.end(); it++ )
        {
            advance( it, 1 );
        }

我遇到了分段错误。我正在尝试获取迭代器中的下一个值,以便将其与十六进制进行比较。

【问题讨论】:

  • 你当然可以。不过,您仍然不能超过end()
  • 尝试一个多一个或少一个字符的字符串,你可能不会遇到段错误。
  • 我想你想用std::adjacent_find()
  • 你可能想去line.end()之前的一个。
  • 看文档:en.cppreference.com/w/cpp/iterator/advance std::advance 不是你想用的...

标签: c++ string iterator


【解决方案1】:

你当然可以在那里使用advance,但要注意:

除非你在离结尾太近之前中断循环,或者字符串的长度是偶数,否则你会遇到缓冲区溢出和 UB。

for( string::iterator it = line.begin(); it != line.end(); it++ )
{
    advance( it, 1 );
}

也等价:

for(auto it = line.begin(); it != line.end(); it += 2 )
{}

因为advance(it, 1); 等价于++i;
见这里:http://en.cppreference.com/w/cpp/iterator/advance

如果您只想要下一个值,请使用 it+1 != line.end() 检查它的存在并使用 it[1] 获取它。

【讨论】:

    【解决方案2】:

    看起来您可能想将它++ 更改为 ++it。我在这里引用了这个示例案例http://www.cplusplus.com/reference/string/string/begin/。我认为这会为你推进迭代器,所以我认为你不需要同时推进迭代器。尝试类似的东西 这个,

    string::iterator it = line.begin();
    while(it != line.end()){
      //Do something with the iterator
      advance( it, 1 );
    }
    

    这是我发现有用的另一个参考。 http://www.cplusplus.com/reference/iterator/advance/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 2020-01-29
      • 2016-12-01
      • 2010-09-23
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      相关资源
      最近更新 更多