错误“不允许系统调用:SYS_kill”,因为我尝试从字符串中删除所有连续的重复元素

时间:2015-04-20 14:12:47

标签: c++ string algorithm

以下

#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上运行时。

我的功能逻辑有问题吗?如果是这样,它是什么,是否有更清洁的方法来解决问题?

2 个答案:

答案 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);
}