2017-06-15 34 views
0

我试图从字符串中删除连续的重复字符,如"helloworld",并删除所有出现的重复字符。在这种情况下,它是'l',所以新字符串应该是"heoword"。我已经写了这样的代码:为什么我需要抛出算法remove()的参数?

#include <algorithm> 
#include <string> 
#include <iostream> 

using namespace std; 

int main() { 
    string s = "helloworld"; 
    for (int i = 0; i < s.length() - 1; i++) { 
    if (s[i] == s[i+1]) { 
     s.erase(remove(s.begin(), s.end(), s[i]), s.end()); // PROBLEM 
     cout << s << endl; // printing `heowrld`, instead of `heoword` 
    } 
    } 
    return 0; 
} 

上面的代码不工作,除非我投s[i]喜欢(char)s[i]。我查找了运算符[]作为字符串,它将位置处的字符返回给引用。 remove方法也接受const T& val作为要替换字符的参数。由于它们都属于同一类型,为什么我不能将s[i]作为remove方法的参数?

p.s.这不是家庭作业问题。通过在remove中投下s[i],我可以得到正确的输出,但我想知道为什么我需要投出s[i]

+7

什么是确切的编译器错误? – NathanOliver

+0

这可能是家庭作业,因此教官fiat禁止,但[看看'std :: unique'](http://en.cppreference.com/w/cpp/algorithm/unique) – user4581301

+0

@NathanOliver我是没有得到任何错误,但输出是'heowrld'而不是'heoword'。 – pseudo

回答

2

这里的问题是你的价值从你自己身上移除。让我们看一下

#include <iostream> 

int main() 
{ 
    int a = 5, b = 10; 
    int & ref = a; 
    std::cout << "a: " << a << " b: " << b << " ref: " << ref << "\n"; 
    std::swap(a, b); 
    std::cout << "a: " << a << " b: " << b << " ref: " << ref << "\n"; 
} 

如果你运行它,你会得到

a: 5 b: 10 ref: 5 
a: 10 b: 5 ref: 10 

,正如你可以看到ref不会移动到现在跟随ba停留(因为它应该),并打印a新的价值。

我们正在与

s.erase(remove(s.begin(), s.end(), s[i]), s.end()); 

看到了同样的事情,因为s[i]是字符串中的元素的引用它的值被改变删除交换周围的元素。因此,它删除了两个l,然后它也删除了最后一个o,因为o移动到l用于占用的相同位置,但它仅在字符串中传递第一个o后才移除。

铸造“修复”这个原因是因为现在你不再引用字符串的一个元素。您创建一个临时变量,并使用该变量值来删除l的。

+0

谢谢!这是一个明确的答案。 – pseudo

+0

@pseudo欢迎您。乐意效劳。 – NathanOliver

相关问题