在另一个主题中,我试图解决这个问题。问题是从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
仿函数被复制到某个地方,那么它的每个成员也会被复制。我看不到这里的问题!