我有一堆充满重复的数据,我想消除重复。 要知道,例如,[1,1,3,5,5,5,7]变为[1,3,5,7]。
它看起来像我可以使用的std ::地图或std ::设为处理这个问题。 但是我不知道它是否会更快(一)简单地全部值插入到容器中,或(b)检查它们是否已经存在于容器中且仅当它们不插入 - 插入是非常有效的? 即使有一个更好的办法...你可以提出一个快速的方法来做到这一点?
另一个问题 - 如果我存储在其中的数据是不是整数的小事,而是是一个自定义类,请问的std ::地图通过操作[设法妥善保存以便快速访问数据(哈希?) ]?
std::map
不使用哈希。 std::unordered_map
做,但是这是C ++ 11。 std::map
和std::set
都使用你提供一个比较。 类模板有这种比较,这可以归结为一个默认operator<
对比,但你可以提供你自己的。
如果不同时需要一个键和存储的值(貌似你没有),你应该只使用一个std::set
,因为这是比较合适的。
该标准并没有说什么数据结构map
S和set
S中的引擎盖下使用,只有certian行动有一定的时间复杂度。 在现实中,大多数实现我知道用树。
这没有什么区别的时间复杂度,明智的,如果你使用operator[]
或insert
,但我会用insert
或operator[]
我做了以前search
之后的insert
,如果该项目没有找到。 稍后,将意味着两个不同的搜索到集插入一个项目。
一个insert()
上的任何相关联的容器做了find()
看是否存在对象,然后插入的对象。 简单地将所述元件成std::set<T>
应该得到合理有效地去掉重复的。
根据您的集的大小和重复的重复值的比率,其可以更快地把物体插入std::vector<T>
std::sort()
然后,然后使用std::unique()
连同std::vector<T>::erase()
摆脱重复的。
你应该多少次呢?
如果刀片是平常:
//*/
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
假设为共同执行战略std::map
和std::set
,即平衡二叉搜索树,插入和查找必须做树的遍历找到那个地方的重点应该是。 所以未能查找,插入通过将大致两倍的时间正好插入。
如何在std ::地图管理妥善存放(哈希?),用于通过operator []的快速访问的数据?
通过您指定的比较函数(或手段std::less
,如果你重载其中工程operator<
你的自定义类型)。 在任何情况下, std::map
和std::set
不是哈希表。
std::set
和std::map
都因为据我所知实现红黑树。 大概只用插入会更快(当时都因为你会加倍查找时间)。
还map
和set
使用operator <
。 只要你的类定义了operator <
这将能够使用它们作为键。