如何正确使用此迭代器

How to use this iterator properly?

本文关键字:迭代器 何正确      更新时间:2023-10-16

我正在尝试使用容器来存储字符串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);
}

这避免了大量的重复测试(如果您使用不同的字母表(例如德语)可能会很快不同步)