Ang*_*ber 0 c++ standard-library
在我下面的代码中,如果找到该项目,我想通知for_each?怎么样?
#include <list>
#include <algorithm>
#include <functional>
using namespace std;
class widget {
public:
widget(int id) : m_id(id) {}
private:
int m_id;
};
class findwidget {
public:
findwidget(widget* p) : m_widget(p) {}
bool operator()(widget* p) const {
return p == m_widget ? true : false;
}
widget* m_widget;
};
list<widget*> m_widgetList;
void push_back(widget* pi){
if(m_widgetList.empty()) {
m_widgetList.push_back(pi);
} else {
if(!std::for_each(m_widgetList.begin(), m_widgetList.end(), findwidget(pi)))
m_widgetList.push_back(pi);
}
}
int main(int argc, char* argv[])
{
widget w1(1);
push_back(&w1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
解决方案是:不要使用std::for_each
.使用以下任何一种(适合您的情况):
示例std::find
:
if(std::find(m_widgetList.begin(), m_widgetList.end(),pi) == m_widgetList.end())
m_widgetList.push_back(pi);
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用std::find
,则不需要findWidget
仿函数.毕竟,你只是在比较地址(即指针).
顺便说一下,您似乎希望列表包含唯一元素,并且不希望保留重复项.如果是这样,那么你最好考虑一下:
std::set
自动处理dupilcate元素.也就是说,你可以这样做:
m_widgetSet.insert(pi);
Run Code Online (Sandbox Code Playgroud)
pi
如果不在其中,它将插入到集合中.如果它已经包含它,insert
则不会将其插入到集合中.