gpt4 book ai didi

c++ - `std::set` 有什么问题?

转载 作者:IT老高 更新时间:2023-10-28 21:45:13 24 4
gpt4 key购买 nike

the other topic我试图解决this问题。问题是从 std::string 中删除重复字符。

std::string s= "saaangeetha";

由于顺序不重要,所以我先将s排序,然后使用std::unique,最后调整大小得到the desired result :

aeghnst

没错!


现在我想做同样的事情,但同时我希望字符的顺序保持不变。意思是,我想要这个输出:

sangeth

所以我写了this :

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 被重复了,尽管其他的重复消失了。代码有什么问题?

无论如何我change my code一点:(见评论)

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 引用类型,那么 the problem doesn't go .

std::setis_repeated 仿函数有什么问题?问题到底出在哪里?

我还注意到,如果 is_repeated 仿函数被复制到某个地方,那么它的每个成员也会被复制。我没有看到这里的问题!

最佳答案

仿函数的设计方式应该是仿函数的拷贝与原始仿函数相同。也就是说,如果您复制一个仿函数,然后执行一系列操作,则无论您使用哪个仿函数,或者即使您交错两个仿函数,结果都应该是相同的。这使 STL 实现可以灵活地复制仿函数并在它认为合适的时候传递它们。

对于您的第一个仿函数,此声明不成立,因为如果我复制您的仿函数然后调用它,您对其存储集所做的更改不会反射(reflect)在原始仿函数中,因此拷贝和原始仿函数的执行方式将有所不同。同样,如果您使用第二个仿函数并使其不通过引用存储其集合,则仿函数的两个拷贝的行为将不同。

不过,您的仿函数最终版本起作用的原因是,集合是通过引用存储的这一事实意味着任何数量的 tue 仿函数拷贝的行为将彼此相同。

希望这会有所帮助!

关于c++ - `std::set` 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com