繁体   English   中英

地图迭代器与手动

[英]Map iterator vs. manual

我正在尝试比较2种填充地图的技术,一种使用迭代器,另一种不使用迭代器。 我听说迭代器可以使其更快,但是如何呢?

//With Iterator
map<int, int>::iterator insert = fibHash.begin();
fibHash.insert(begin, pair<int, int> (n, fib_val));

//Without iterator
fibHash.insert(pair<int, int> (n, fib_val));

首先,必须记住std::map是有序结构,因此不能将元素放置在任意位置。 根据严格的弱有序关系 (满足特定条件的“ then-then”关系),某个元素只能相对于其他元素放置在某个位置。

第一个变量采用迭代器作为元素位置良好的提示,并且只有在插入发生在输入迭代器旁边时,插入才会更快(摊销的固定时间)。 否则,复杂度与第二个变体(对数)相同。

第一个变体使用第一个参数作为提示,然后尝试插入。 如果提示正确,则只需进行少量比较即可找到正确的插入位置。

第一种形式(提供迭代器)有可能在运行时更快-但只有当选择了良好的迭代器时才可能,甚至在实现使用提示时也是如此。 您发送给insert的迭代器只是一个提示。 insert不一定要将元素插入那里,因为map是一个排序的容器。 相反,迭代器可以通过实施为起点,在查找那里插入元素可以使用。

因此,如果通过精心选择的迭代器(通常不会使用begin() ),则使用带有提示迭代器的insert版本,理论上您可以接近插入的摊销固定时间,而使用非提示版本您正在寻找O(log n)进行插入。

补充说明一下:如果您关心速度,还可以考虑使用新的C ++ 11方法std :: map :: emplacestd :: map :: emplace_hint将元素插入到std::map 代替将键/值对的副本传递到容器,emplace仅传递用于在正确位置就地创建该对的参数。 这可以为您节省昂贵的副本(尽管在int实例中,这与较大的数据结构(如矩阵等)相比并没有太大的区别)。

std::map<int,int> MyMap;
MyMap.emplace(5,10); // passing 5,10 to ctor of std::pair<const int,int> in-place
MyMap.insert(std::pair<const int,int>(5,10)); // construct a std::pair<const int,int> and pass it to insert, such that it creates a copy in the right location within the map

//similarly with the 'hint' methods
MyMap.emplace_hint(MyMap.end(),6,20);
MyMap.insert(MyMap.end(),std::pair<const int,int>(6,20));

顺便说一句, std::map<int,int>::value_type实际上是std::pair<const int,int> ,而不是std::pair<int,int>

迭代器是一种设计模式,所有程序员都应考虑这一点。 是的,迭代器并不是真的更快,但是更干净,它们允许您以安全干净的方式“迭代”数据结构,因此您不必担心会混淆真实的信息。

在这种情况下,您一次只能插入一个值,因此迭代器并不是真正的“最快”解决方案,只是某些函数也可以使用它。

在第一个示例中,您将在数据结构的“开始”处插入一个值,并且迭代器正在帮助您确定位置。

在第二个中,您只是将值插入到末尾或默认插入位置,因此您实际上不需要迭代器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM