std::在循环中计算重复字符时擦除崩溃

std::erase crash when count duplicate char in a loop?

本文关键字:字符 崩溃 擦除 计算 循环 std      更新时间:2023-10-16

在下面的代码中抛出了分段错误。

计算重复字符的总数作为示例

输入

helloWorld

输出

l = 3
o = 2

步骤

  1. 循环输入字符串

  2. 搜索每个字符

  3. 计数找到

  4. 德尔伯爵查尔

下面是我的代码

#include<iostream>
#include<string>
#include<bits/stdc++.h>
#include <algorithm>
int main()
{
        std::string str;
        std::cin>>str;
        int cout = 0;
        std::string::iterator it1,it2;
        for(it1 = str.begin() ; it1!=str.end(); ++it1)
        {
                for(it2 = str.begin() ; it2!=str.end(); ++it2)
                {
                        if(*it1==*it2)
                        {
                                ++cout;
                                continue ;
                        }
                }
                if(cout >1)
                {
                        std::cout<<*it1<<"="<<cout<<"n";
                        if(!str.empty() && str.find(*it1))
                          str.erase(std::remove(str.begin(), str.end(), *it1), str.end()); // remove char once count done
                }
                        cout=0;
        }
}
当您

调整字符串str时,您的迭代器it1it2失效

不要那样做。请改用std::string(std::size_t类型(中的索引。

(我会使用一个容器来解决这个问题foo比如大小CHAR_MAX - CHAR_MIN + 1 int,初始化为零,这样foo[i]是字符i出现的次数。这可以填充在 O(N( 中,输出级特别琐碎:请参阅字符串中的重复字符是否可以在 O(n( 中识别和量化?

使用 c++ 的内置功能。通过使用 sortadjacent_findO(n log n( 时间内执行此操作:

sort(begin(str), end(str));
for(auto start = adjacent_find(cbegin(str), cend(str)), finish = upper_bound(start, cend(str), *start); start != cend(str); start = adjacent_find(finish, cend(str)), finish = upper_bound(start, cend(str), *start)) {
   cout << *start << " = " << distance(start, finish) << endl;
}

现场示例