从字符串向量中获取字符串的第一个字符

4

如何在迭代字符串向量时获取第一个字符或按索引获取一个字符。以下是我的代码:

vector<string>::iterator i=vec.begin();
    while(i!=vec.end()){
        if(i[0]==ch)
            cout<<"output";
    }

出现错误:

没有匹配的'operator=='(操作数类型为'std::basic_string'和'char')|


1
请使用基于范围的 for 循环替换您的 while 循环,例如 for( const string& s : vec ) { if( s.length() > 0 && s[0] == ch ) - Cheers and hth. - Alf
4个回答

6

请尝试以下方法

vector<string>::iterator i=vec.begin();
    while(i!=vec.end()){
        if(i[0][0] == ch)
            cout<<"output";
        ++i;
    }

i[0]返回指针i所指向的整个字符串,而i[0][0]返回该字符串的第一个字符,即使该字符串为空(此时值为“\0”)。

但是您可以更简单地写。

for ( const std::string &s : vec )
{
    if ( s[0] == ch ) cout << "output";
}

如果你想使用一些可以具有任何值的索引,那么代码可能会像这样:
vector<string>::iterator i=vec.begin();
    while(i!=vec.end()){
        if( index < i[0].size() && i[0][index] == ch)
            cout<<"output";
        ++i;
    }

或者

for ( const std::string &s : vec )
{
    if ( index < s.size() && s[index] == ch ) cout << "output";
}

1
我会说(*i)而不是i[0]。同样,i->size() - user1084944
@Hurkyl 我展示了当使用表达式 i[0] 时的正确语法和语义。 :) - Vlad from Moscow
在使用 while 语法时,你漏掉了 ++i; - Jérôme
@Jerome L 不是我。:) 是主题的作者错过了++i。我只是复制他的代码来显示正确的表达式。:) - Vlad from Moscow

3

不必在这里编写循环,我会使用一个标准算法。例如,要显示以指定字母开头的所有字符串(每行一个),可以使用以下代码:

std::copy_if(vec.begin(), vec.end(), 
             std::ostream_iterator<std::string>(std::cout, "\n"),
             [ch](std::string const &s) { return s[0] == ch; });

2
要获取向量中索引k处的字符串,可以使用以下代码:
vector<string>::iterator i = vec.begin();
while (i != vec.end())
{
  if (i - vec.begin() == k)
    cout << (*i) << endl;
  ++i;
}

要从该字符串中获取字符,您可以在适当的位置解除引用。

1
我是否漏掉了什么,或者你只需要写 vec[k] 而不是整个代码块? - Julian
1
这并没有回答问题。所有它做的就是以迂回和低效的方式打印出向量中的第k个字符串。这等同于 cout << vec[k] << endl; - gla3dr
没错。不过,我觉得这个人可能除了简单的解引用之外还有其他用途,并且他给出这个查询作为一个示例。所以,我认为最好按照他的要求使用循环。 - therainmaker

2

i是您的序列中的迭代器,而不是序列中的元素。 i就像一个指针;您需要执行*i才能获取迭代器指向的元素。例如,(*i)[0]i指向的字符串的第一个字符(当然,假设它是非空的——如果为空,则这是未定义行为,可能会发生各种可怕的事情)。

此外,您似乎忘记了实际迭代您的序列;例如,在每次迭代结束时使用++i进行推进。

但是,除非您专门需要使用迭代器,否则您应该更喜欢类似以下内容的东西:

for(std::string &s : vec) {
    // do something with s
}

(或者更简单地说,auto &s : vec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接