C++ 如何正确使用这个迭代器?
我试图使用容器来存储stringC++ 如何正确使用这个迭代器?,c++,c++11,stl,containers,C++,C++11,Stl,Containers,我试图使用容器来存储strings的迭代器,但在运行它时遇到了段错误。正如您将在下面看到的,错误似乎来自char temp=**itbegin,这可能意味着我不能通过前面的迭代器分配任何值 为什么?我是否误用了迭代器?如何正确使用迭代器 #include <iostream> #include <vector> using namespace std; string reverseVowels(string s); int main() { string s =
s
的迭代器,但在运行它时遇到了段错误。正如您将在下面看到的,错误似乎来自char temp=**itbegin代码>,这可能意味着我不能通过前面的迭代器分配任何值
为什么?我是否误用了迭代器?如何正确使用迭代器
#include <iostream>
#include <vector>
using namespace std;
string reverseVowels(string s);
int main()
{
string s ="hello";
cout << reverseVowels(s);
}
string reverseVowels(string s) {
string::iterator iter = s.begin();
string::iterator iterend = s.end();
vector<string::iterator> iteratorbox;
for(;iter != iterend ; ++iter){
if((*iter) == 'a' &&
(*iter) == 'e' &&
(*iter) == 'i' &&
(*iter) == 'o' &&
(*iter) == 'u'){
iteratorbox.push_back(iter);
}
}
auto itbegin = iteratorbox.begin();
auto itend = iteratorbox.end() ;
--itend;
//for(;itbegin < itend ; ++itbegin, --itend)
{
char temp = **itbegin;
// *(*itbegin) = *(*itend);
// *(*itend) = temp;
}
return s;
}
#包括
#包括
使用名称空间std;
字符串反转窗口(字符串s);
int main()
{
字符串s=“hello”;
cout您的问题来自于在iteratorbox
向量中插入迭代器的条件
您使用了&
运算符,这意味着字符串的每个字母必须同时等于所有元音。这意味着不会插入迭代器,然后您将尝试取消引用开始()
vector的迭代器,正好是它的结束迭代器。这会导致未定义的行为,在您的情况下,这会表现为崩溃
你可能想用
((*iter) == 'a' ||
(*iter) == 'e' ||
(*iter) == 'i' ||
(*iter) == 'o' ||
(*iter) == 'u')
作为一个条件。由@rems4e给出的答案非常好,但我发现如果将元音放入数组中,这样的代码更容易阅读,也不容易出错
char const vowels[] = { 'a', 'e', 'i', 'o', 'u' };
这样,您就可以将reverseVowels
中的匹配逻辑封装到标准算法any\u
if (std::is_any_of(std::begin(vowels), std::end(vowels), [](auto const& v) {
return *iter == v;
}) {
iteratorbox.push_back(iter);
}
这避免了大量重复测试(如果您使用不同的字母表(例如德语),可能会很快失去同步)要修复writechar temp=(*itbegin)[0];
您应该添加#include
以使代码可移植。@TauBai,如果有帮助,请给出答案。