2014-07-11 50 views
3

我是C++新手,刚刚学习了迭代器。我有这样的代码:取消引用字符迭代器

//lines is a vector<string> 
for (auto it = lines.begin(); it != lines.end(); ++it) { 
    //I want to access each characters in each element (string) of the vector 
    for (auto it2 = *it->begin(); it2 != *it->end(); ++it2) { 
     cout << *it2 << endl; //error: invalid type argument of unary '*' (have 'char') 
    } 
    cout << *it << endl; //ok 
} 

我测试的字符串asigning给一个变量:

string word = *it; 
for (auto it2 = word.begin(); it2 != word.end(); ++it2) { 
    cout << *it2 << endl; //ok 
} 

我的问题是,为什么第二代码工作,而先不?在我看来,* it2是一个字符串,我可以使用迭代器访问它里面的字符,但事实证明,我必须将它赋值给一个变量才能工作。我不明白编译器错误。有什么不同?

+1

'它 - >开始()'是'string'的迭代器。 '* it-> begin()'提供给你一个'char'的引用。 –

回答

4

的问题实际上是对线之上。

for (auto it2 = *it->begin(); it2 != *it->end(); ++it2) { 

类型的auto实际上转化为char因为你太早提领你的迭代器。 *it->begin()实际上需要string.begin()并取消它,返回char。要解决,只是从你的for语句删除迭代器解引用,就像这样:

for (auto it2 = it->begin(); it2 != it->end(); ++it2) { 
+3

当然,因为他使用'auto',所以他有C++ 11,并且可以使用for(std :: string line:lines){for(char ch:line){...}} –

+0

@ James Kanze是我之前做过的。但我正在阅读的书中的练习是使用迭代器来试用它:) – morbidCode

+0

@ user3263252出于好奇,它是哪本书? –

1

您与指针构件->混合解引用*在一起,只有一个使用:

for (auto it2 = it->begin(); it2 != it->end(); ++it2) { 

for (auto it2 = (*it).begin(); it2 != (*it).end(); ++it2) {