【发布时间】:2016-11-02 11:22:36
【问题描述】:
我有大量数据要从文件加载到 map 中,该文件已经按排序顺序(因为它是从地图中序列化的)。
我发现首先将数据加载到vector,然后使用insert 批量加载到map 会更快。这在 19 秒的加载时间内节省了一秒多一点。
value_type 是一个包含其他结构向量的结构。加载完成后我不需要vector,因此我在调用map::insert 时使用move_iterators。使用 MSVC 2015 (VC14),数据不会移动到地图中,而是通过 STL 代码深处的const_reference 复制。
这是一个符合标准的实现,忽略数据的移动吗?
template<typename Stream, typename Key, typename Type, typename Traits, typename Allocator>
bool const read(Stream &is, std::map<Key, Type, Traits, Allocator> &map)
{
size_t size;
read(is, size);
std::vector<std::pair<Key, Type>> items(size);
for (size_t i=0; i<size; ++i)
{
auto &item = items[i];
if (!read(is, item.first) || !read(is, item.second))
return false;
}
map.insert(std::make_move_iterator(items.begin()), std::make_move_iterator(items.end()));
return !!is;
}
我已经解决了用
替换map.insert的问题
for (auto &item : items)
map.insert(std::move(item));
但它不是那么整洁,但确实节省了 0.6 秒。
【问题讨论】:
标签: c++11 dictionary stl move move-semantics