在另一个主题中,我尝试解决这个问题。问题是从std::string
中去除重复字符。
std::string s= "saaangeetha";
由于顺序不重要,所以我先对s
进行排序,然后使用std::unique
,最后调整大小以获得所需的结果:
aeghnst
没错!
现在我想要做同样的事情,但同时我希望字符的顺序保持不变。也就是说,我想要这个输出:
sangeth
所以我写了这个:
template<typename T>
struct is_repeated
{
std::set<T> unique;
bool operator()(T c) { return !unique.insert(c).second; }
};
int main() {
std::string s= "saaangeetha";
s.erase(std::remove_if(s.begin(), s.end(), is_repeated<char>()), s.end());
std::cout << s ;
}
这将产生以下输出:
saangeth
也就是说,虽然有其他的重复,但
a
被重复了。这段代码有什么问题吗?无论如何我稍微改动了一下我的代码:(见注释)
template<typename T>
struct is_repeated
{
std::set<T> & unique; //made reference!
is_repeated(std::set<T> &s) : unique(s) {} //added line!
bool operator()(T c) { return !unique.insert(c).second; }
};
int main() {
std::string s= "saaangeetha";
std::set<char> set; //added line!
s.erase(std::remove_if(s.begin(),s.end(),is_repeated<char>(set)),s.end());
std::cout << s ;
}
输出:
sangeth
问题解决了!
那么第一种解决方案有什么问题呢?
此外,如果我不将成员变量unique
设置为引用类型,则问题就无法解决。
std::set
或 is_repeated
函数对象有什么问题?问题出在哪里?
我也注意到,如果把is_repeated
函数对象复制到其他地方,那么它的每个成员也会被复制。我看不出这有什么问题!