这是我的代码的一部分:
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'){
我该怎么做才能让它发挥作用?
答案 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;
}