我有一个工作程序,使用迭代器来优化向量中的字符串:
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();
为什么我必须在迭代它之前将它保存到另一个变量,这是没有意义的。欢呼。
答案 0 :(得分:4)
由于您使用的是C ++ 11,因此请查看代码使用远程循环的简单程度,如下例所示:
std::vector<std::string> v(10, "apples");
for(auto &&word : v) {
word[0] = toupper(word[0]);
}
现在就它而言(*vIterator.begin();
似乎不起作用。):
点运算符(即.
)的优先级高于解除引用运算符(即*
)。因此,*vIterator.begin()
被解释为*(vIterator.begin())
。编译器正确地抱怨,因为vIterator
没有成员begin()
。
将迭代器视为指针。通过指向它的指针/迭代器访问对象成员的正确方法是使用箭头操作符(即vIterator->begin()
)或首先取消引用指针/迭代器,然后使用点运算符(即{ {1}})。
因此,通过使用迭代器的代码将成为:
(*vIterator).begin()
答案 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]);});
}