通过它的迭代器访问字符串向量中的字符

时间:2014-11-16 13:04:55

标签: c++ string vector iterator

这是我的代码的一部分:

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'){

我该怎么做才能让它发挥作用?

2 个答案:

答案 0 :(得分:1)

尝试以下

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

原始代码段的问题与运营商的优先级有关。 Postfix运算符[]的优先级高于一元运算符*。因此这个表达

*sy_iterator[4]

相当于

*( sy_iterator[4] )

表达式sy_iterator[4]将产生一个由迭代器sy_iterator + 4指向的字符串,您尝试将其应用于operator *。但类字符串没有运算符*。所以编译器发出错误。

至于这句话

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

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

考虑到类std;:vector有rnadom访问迭代器所以例如表达式

syntax_words.begin() + 4

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

答案 1 :(得分:1)

你可以这样说:
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;
}