如何将std :: set / add条件中的元素循环到vs2008中的std :: set上的std :: for_each?

时间:2013-05-28 19:00:31

标签: c++ boost stl stdset

从这里: http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_server.cpp

  std::set<chat_participant_ptr> participants_;
  ....
  participants_.insert(participant);
  ....

 void deliver(const chat_message& msg, chat_participant_ptr participant)
  {
    recent_msgs_.push_back(msg);
    while (recent_msgs_.size() > max_recent_msgs)
      recent_msgs_.pop_front();

    // I want to call the deliver method on all members of set except the participant passed to this function, how to do this?
    std::for_each(participants_.begin(), participants_.end(),
        boost::bind(&chat_participant::deliver, _1, boost::ref(msg)));
  }

我想在set的所有成员上调用deliver方法,除了传递给此函数的参与者,如何在vs2008中执行此操作?

3 个答案:

答案 0 :(得分:2)

for (auto &p : participants_)
    if (p != participant)
    {
        //do your stuff
    }

答案 1 :(得分:2)

真的,最明显的可能就是直接写一个for循环:

for (auto &p : participants_) {
    if (p != participant)
        p->deliver();
}

或C ++ 03等价物:

for (std::set<chat_participant_ptr>::iterator i = participants_.begin();
     i != participants_.end(); ++i)
{
    if ((*i) != participant)
        (*i)->deliver();
}

我认为使用for_each不会在这里给你带来任何普遍性或表现力,主要是因为你没有写任何你想重复使用的东西。


如果你发现自己想要经常做类似的事情,你可以写一个通用的for_each_not_of。那是真的吗?

答案 2 :(得分:1)

使用迭代器的简单for循环应该可以解决问题。

std::set<chat_participant_ptr>::iterator iter;
for(iter = participants_.begin();iter != participants_.end();++iter)
{
    if(participant != iter)
    {
        call deliver function on *iter 
    }
}