C ++的std ::地图或std ::设置 - 有效地插入重复(C++ std::map or s

2019-08-01 08:12发布

我有一堆充满重复的数据,我想消除重复。 要知道,例如,[1,1,3,5,5,5,7]变为[1,3,5,7]。

它看起来像我可以使用的std ::地图或std ::设为处理这个问题。 但是我不知道它是否会更快(一)简单地全部值插入到容器中,或(b)检查它们是否已经存在于容器中且仅当它们不插入 - 插入是非常有效的? 即使有一个更好的办法...你可以提出一个快速的方法来做到这一点?

另一个问题 - 如果我存储在其中的数据是不是整数的小事,而是是一个自定义类,请问的std ::地图通过操作[设法妥善保存以便快速访问数据(哈希?) ]?

Answer 1:

std::map不使用哈希。 std::unordered_map做,但是这是C ++ 11。 std::mapstd::set都使用你提供一个比较。 类模板有这种比较,这可以归结为一个默认operator<对比,但你可以提供你自己的。

如果不同时需要一个键和存储的值(貌似你没有),你应该只使用一个std::set ,因为这是比较合适的。

该标准并没有说什么数据结构map S和set S中的引擎盖下使用,只有certian行动有一定的时间复杂度。 在现实中,大多数实现我知道用树。

这没有什么区别的时间复杂度,明智的,如果你使用operator[]insert ,但我会用insertoperator[]我做了以前search之后的insert ,如果该项目没有找到。 稍后,将意味着两个不同的搜索到集插入一个项目。



Answer 2:

一个insert()上的任何相关联的容器做了find()看是否存在对象,然后插入的对象。 简单地将所述元件成std::set<T>应该得到合理有效地去掉重复的。

根据您的集的大小和重复的重复值的比率,其可以更快地把物体插入std::vector<T> std::sort()然后,然后使用std::unique()连同std::vector<T>::erase()摆脱重复的。



Answer 3:

你应该多少次呢?

如果刀片是平常:

//*/
std::set<int> store;
/*/
// for hash:
std::unordered_set<int> store;
//*/
int number;

if ( store.insert(number).second )
{
  // was not in store
}

如果您填写一次:

std::vector<int> store;
int number;

store.push_back(number);
std::sort(store.begin(),store.end());
store.erase(std::unique(store.begin(),store.end()),store.end() );

// elements are unique


Answer 4:

假设为共同执行战略std::mapstd::set ,即平衡二叉搜索树,插入和查找必须做树的遍历找到那个地方的重点应该是。 所以未能查找,插入通过将大致两倍的时间正好插入。

如何在std ::地图管理妥善存放(哈希?),用于通过operator []的快速访问的数据?

通过您指定的比较函数(或手段std::less ,如果你重载其中工程operator<你的自定义类型)。 在任何情况下, std::mapstd::set 不是哈希表。



Answer 5:

std::setstd::map都因为据我所知实现红黑树。 大概只用插入会更快(当时都因为你会加倍查找时间)。

mapset使用operator < 。 只要你的类定义了operator <这将能够使用它们作为键。



文章来源: C++ std::map or std::set - efficiently insert duplicates