C ++ / Boost将列表项插入到地图中,无需手动循环

时间:2013-05-04 21:26:11

标签: c++ list boost map insert

在C ++程序中,我有一个std :: list和std :: map(虽然我实际上使用的是boost:unordered_map),我想知道一种优雅的方式将列表中的所有元素插入到地图中。我希望密钥是对列表中元素的方法调用的结果。

例如,我有:

std::list<Message> messages = *another list with elements*;
std::map<std::string, Message> message_map;

我希望将列表中的所有元素插入到地图中,其中键为message.id(),用于消息中的每条消息。

有没有办法在不循环列表并手动执行的情况下执行此操作? 我不能使用C ++ 11 ,但出于兴趣,我仍然会对C ++ 11解决方案感兴趣。我可以使用boost。

谢谢。

4 个答案:

答案 0 :(得分:3)

C ++ 11解决方案:您可以使用std::transformstd::list元素转换为std::map元素:

std::transform(message.begin(), messages.end(),
               std::inserter(message_map, message_map.end()),
               [](const Message& m) { return std::make_pair(m.id(), m); });

通过传递函数指针而不是lambda,可以使用C ++ 03完成等价物。

答案 1 :(得分:2)

不确定它是否比for循环好,但你可以使用仿函数

struct map_inserter {
   std::map<string,Message>& t_map;
   map_inserter(std::map<string,Message>& t_map) : t_map(t_map) {}
   void operator()(Message& m) {
       t_map.insert(std::pair<string,Message>(m.get_id(),m));
   }
};

您可以像这样使用

std::map<string,Message> t_map;
std::for_each(vec.begin(), vec.end(), map_inserter(t_map));

答案 2 :(得分:0)

如果你能得到迭代器到l的开头和结尾你可以用于每个()

答案 3 :(得分:0)

您可以使用accumulate

typedef std::map<std::string, Message> MessageMap;

MessageMap& addIdAndMessage(MessageMap& messageMap, const Message& message) {
    messageMap[message.id()] = message;
    return messageMap;
}

int main() {
    std::list<Message> messages;
    //...
    MessageMap message_map =
        accumulate(messages.begin(), message.end(),
                   MessageMap(),
                   addIdAndMessage);
}