是否有可能迭代迭代器?

时间:2014-08-09 03:06:46

标签: c++ iterator

我有一个工作程序,使用迭代器来优化向量中的字符串:

vector<string> v7{ 10, "apples" };  

for (auto vIterator= v7.begin(); vIterator!= v7.end(); ++vIterator){
    auto word = *vIterator; //here
    auto charIterator = word.begin(); 
    *charIterator = toupper(*charIterator);
    *vIterator = word; //also here, i guess i could just print `word` instead?
    cout << *vIterator << endl;
}

我的问题是;
循环中的第二行@评论,我必须将pointer to the iterator保存到另一个string variable才能迭代它。

像这样迭代指针

*vIterator.begin();

似乎没有用。

这是正确的做法,还是我错过了什么?
 我是C语言的新手,即使我可以使用指针式工具背后的概念也很难理解,在这种情况下,我觉得我做错了。

编辑:这是语法错误(* vIterator).begin();
为什么我必须在迭代它之前将它保存到另一个变量,这是没有意义的。欢呼。

3 个答案:

答案 0 :(得分:4)

由于您使用的是C ++ 11,因此请查看代码使用远程循环的简单程度,如下例所示:

  std::vector<std::string> v(10, "apples");  
  for(auto &&word : v) {
    word[0] = toupper(word[0]);
  }

LIVE DEMO

现在就它而言(*vIterator.begin();似乎不起作用。):

  • 点运算符(即.)的优先级高于解除引用运算符(即*)。因此,*vIterator.begin()被解释为*(vIterator.begin())。编译器正确地抱怨,因为vIterator没有成员begin()

  • 将迭代器视为指针。通过指向它的指针/迭代器访问对象成员的正确方法是使用箭头操作符(即vIterator->begin())或首先取消引用指针/迭代器,然后使用点运算符(即{ {1}})。

因此,通过使用迭代器的代码将成为:

(*vIterator).begin()

LIVE DEMO

答案 1 :(得分:1)

撰写*vIterator.begin();的正确方法是(*vIterator).begin();,或者更常见的是vIterator->begin();。另请注意,您还可以直接访问字符串的第一个字符(无需迭代)作为word[0]

答案 2 :(得分:0)

一种简单的STL - 这样做的方法:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<string> v7{ 10, "apples" };  
    for_each(v7.begin(), v7.end(), [](string& word){word[0] = toupper(word[0]);});
}