以下
#include <iostream>
#include <string>
void remove_duplicates ( std::string & s )
{
for (std::string::iterator it(s.begin()), offend(s.end()); it != offend; ++it)
{
std::string::iterator temp = it;
while (++it != offend && *it == *temp);
if ((it-temp)>1) s.erase(temp, it);
}
}
int main()
{
std::string str = "aaabbcaaaaa";
remove_duplicates(str);
std::cout << str; /* Expected output: "abca" */
return 0;
}
正在产生错误
/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2 /../../../../包括/ C ++ / 4.1.2 /比特/ basic_string.h: 1154: __gnu_cxx :: __ normal_iterator :: other :: pointer,std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; &GT; std :: basic_string&lt; _CharT,_Traits,_Alloc&gt; :: erase(__ gnu_cxx :: __ normal_iterator :: other :: pointer,std :: basic_string&lt; _CharT,_Traits,_Alloc&gt;&gt;,__ nuu_cxx :: __ normal_iterator :: other :: pointer ,std :: basic_string&lt; _CharT,_Traits,_Alloc&gt;&gt;)[with _CharT = char,_Traits = std :: char_traits,_Alloc = std :: allocator]:断言 '__first&gt; = _M_ibegin()&amp;&amp; __first&lt; = __last&amp;&amp; __last&lt; = _M_iend()' 失败。
不允许系统调用:SYS_kill
当我在http://codepad.org/KXgHqKS2上运行时。
我的功能逻辑有问题吗?如果是这样,它是什么,是否有更清洁的方法来解决问题?
答案 0 :(得分:2)
我的功能逻辑有问题吗?
是的,擦除元素使迭代器无效。如果您想通过steam执行此操作,则需要进行两项更改:
end
迭代器,或者在擦除后更新它; it
it = erase(temp, it)
有没有更清洁的方法来解决问题?
s.erase(std::unique(s.begin(), s.end()), s.end());
答案 1 :(得分:0)
代码s.erase(temp, it);
使迭代器it
无效,++it
循环中的for
变为未定义的行为。
以下是我对您感兴趣的remove_duplicates
的实施:
void remove_duplicates(std::string& str) {
if (str.empty()) return;
std::string::iterator it = str.begin();
std::string::iterator itt = it + 1;
while (itt < str.end()) {
if (*itt == *it) {
++itt;
}
else {
*++it = *itt++;
}
}
str.resize(it - str.begin() + 1);
}