2013-05-28 3 views
0

здесь: http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_server.cppКак перебрать элементы в std :: set/add условие в std :: for_each через std :: set в vs2008?

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?

ответ

1

Простая петля с использованием итератора должна делать трюк.

std::set<chat_participant_ptr>::iterator iter; 
for(iter = participants_.begin();iter != participants_.end();++iter) 
{ 
    if(participant != iter) 
    { 
     call deliver function on *iter 
    } 
} 
2
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. Это действительно так?

+0

Я получаю отсутствующий спецификатор типа при авто –

+0

Вы компилируете с C++ 11? Если нет (и если вы не можете включить его), это всего лишь компактный способ записи регулярного цикла 'for', итерации по набору. – Useless

+0

no I m not, что я должен делать в таком случае? –

Смежные вопросы