如何正确使用此迭代器
How to use this iterator properly?
我正在尝试使用容器来存储字符串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;
}
您的问题来自您在 iteratorbox
向量中插入迭代器的条件。
您使用了 &&
运算符,这意味着字符串的每个字母必须同时等于所有元音。这意味着不会插入任何迭代器,然后您尝试取消引用向量的begin()
迭代器,这恰好是它的过去迭代器。这会导致未定义的行为,在您的情况下表现为崩溃。
您可能打算使用
((*iter) == 'a' ||
(*iter) == 'e' ||
(*iter) == 'i' ||
(*iter) == 'o' ||
(*iter) == 'u')
作为条件。
@rems4e的答案完全没问题,但是如果您将元音放入数组中,我发现这样的代码更容易阅读并且更不容易出错
char const vowels[] = { 'a', 'e', 'i', 'o', 'u' };
以便您可以将reverseVowels
内的匹配逻辑封装到标准算法any_of
if (std::is_any_of(std::begin(vowels), std::end(vowels), [](auto const& v) {
return *iter == v;
}) {
iteratorbox.push_back(iter);
}
这避免了大量的重复测试(如果您使用不同的字母表(例如德语)可能会很快不同步)
相关文章:
- 在C++中释放内存期间,迭代器与指针有何不同
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 如何在C++中仅使用迭代器正确迭代 3D 向量?
- 如何正确实现自动迭代器
- 在 C++17 中实现迭代器和const_iterator的正确方法是什么?
- 自定义迭代器:如果 a 和 b 的行为不同,如何正确处理距离计算和相等比较
- 如何正确实现 -> 和 (*)。这样它们的行为就像 -> 和 (*)。在迭代器中
- 实现迭代器通用方法的正确方式
- 如何在C++中正确递增返回的迭代器
- 正确取消对指针的迭代器引用
- 如何正确地声明从非常量迭代器到指针的常量指针
- 正确读取二进制文件并使用流迭代器
- 映射的迭代器不保存正确的值
- 类成员向量上的迭代器未正确取消引用
- 如何正确使用此迭代器
- 迭代器无法正确访问问题
- map/set :: 插入是否提供了正确的迭代器提示,它的复杂性是多少?
- 返回链表的正确迭代器类型
- C++函数从列表中查找最小值.此函数是否正确,因为返回的迭代器失效
- 堆排序向量的客户端,传递迭代器不正确