std::在循环中计算重复字符时擦除崩溃
std::erase crash when count duplicate char in a loop?
在下面的代码中抛出了分段错误。
计算重复字符的总数作为示例
输入:
helloWorld
输出:
l = 3
o = 2
步骤
循环输入字符串
搜索每个字符
计数找到
德尔伯爵查尔
下面是我的代码
#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
时,您的迭代器it1
和it2
将失效。
不要那样做。请改用std::string
(std::size_t
类型(中的索引。
(我会使用一个容器来解决这个问题foo
比如大小CHAR_MAX - CHAR_MIN + 1
int
,初始化为零,这样foo[i]
是字符i
出现的次数。这可以填充在 O(N( 中,输出级特别琐碎:请参阅字符串中的重复字符是否可以在 O(n( 中识别和量化?
使用 c++ 的内置功能。通过使用 sort
和 adjacent_find
在 O(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;
}
现场示例
相关文章:
- 如何避免在打印类似于"%q"的字符时在 vsprintf_s() 处崩溃
- Clang 崩溃,在 std::async 中出现字符 * 异常
- 释放字符的动态数组时崩溃
- Visual C 32位整数从文件到8位字符到文件 - 程序在某些整数上崩溃
- C 程序仅在字符阵列获得“ 1000!”的输入时才在DELETE上崩溃
- "std::isdigit"正在崩溃几个扩展的 ASCII 字符
- 使用字符串而不是字符数组时程序崩溃
- std::在循环中计算重复字符时擦除崩溃
- 多次使用动态字符数组后出现未知崩溃
- 程序在解除分配字符数组时崩溃
- 在执行字符串时更改字符会使程序崩溃
- python字符串使用特殊字符发送到c++dll,崩溃
- Tizen IDE中的本机应用程序:签名崩溃并打印奇怪的非ASCII字符
- 在内存中搜索字符串会导致崩溃
- 为什么我的程序在从字符串中读取连字符时会崩溃
- 将 C 字符串分配给字符 - C++程序崩溃
- 代码崩溃.尝试从字符数组 C 中删除字符
- 将字符指针设置为Int值时QT崩溃
- C++字符*错误,程序崩溃
- 删除字符* 崩溃程序