Как зациклить элементы в условии std :: set / add для std :: for_each поверх std :: set в vs2008?

отсюда :
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)));
}

Я хочу вызвать метод доставки для всех членов набора, кроме участника, переданного этой функции, как это сделать в vs2008?

0

Решение

Простой цикл for с использованием итератора должен помочь.

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

Другие решения

for (auto &p : participants_)
if (p != participant)
{
//do your stuff
}
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
По вопросам рекламы [email protected]