在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。
谢谢。
答案 0 :(得分:3)
C ++ 11解决方案:您可以使用std::transform
从std::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);
}