这个问题在这里已经有了答案:What'sthedifferencebetweensetandmapinC++?(7个答案)关闭8年前。我是C++编程的新手,想知道是否有人可以帮助我澄清一些问题。http://www.cplusplus.com/reference/set/set/http://www.cplusplus.com/reference/map/map/我一直在阅读有关如何实现STL二叉搜索树的文章,并且我一直注意到std::set和std::map经常被提及作为完成此类任务的方法。然而,两者之间到底有什么区别呢?对我来说,两者几乎完全相同,我不确定是否有我没有注意到的东西使
对于大多数容器,iteratortype提供对容器中值的读写访问,const_iterator类型提供只读访问。但是,对于std::set,迭代器类型无法提供读写访问,因为修改集合中的值(可能)会破坏容器不变量。因此,在std::set,两者iterator和const_iterator提供只读访问权限。这引出了我的问题:使用std::set::iterator可以做的事情之间有什么区别吗?以及你可以用std::set::const_iterator做的事情?请注意,在C++11中,容器的操作方法(例如erase)可以采用const_iterator。参数。
如何从std::set中高效地选择一个随机元素?std::set::iterator不是随机访问迭代器。所以我不能像为std::deque或std::vector那样直接索引一个随机选择的元素我可以获取从std::set::begin()返回的迭代器,并在[0,std::set::size()),但这似乎做了很多不必要的工作。对于接近集大小的“索引”,我最终会遍历内部树结构的整个前半部分,即使它已经知道该元素不会在那里找到。有没有更好的方法?以效率的名义,我愿意将“随机”定义为随机性比我可能用来在vector中选择随机索引的任何方法都要小。称之为“相当随机”。编辑...下面有许多有见地
我有一个这样的集合:set,owner_less>>setName;它工作正常。但我想将其更改为无序集。但是,当我这样做时,我得到了大约六页错误。有什么想法吗?在查看所有页面的错误消息后,我找到了可能有帮助的行。/usr/include/c++/4.7/bits/functional_hash.h:60:7:error:staticassertionfailed:std::hashisnotspecializedforthistype/usr/include/c++/4.7/bits/stl_function.h:Ininstantiationof‘boolstd::equal_to:
是否在std::setinvalidateiterator中调用erase?正如我在最后一行的第5名以下所做的那样..?如果是,从集合中删除所有元素的更好方法是什么classclassA{public:classA(){};~classA(){};};structstructB{};typedefstd::setSETTYPE;typedefstd::mapMAPTYPE;int__cdeclwmain(intargc,wchar_t*pArgs[]){MAPTYPEmapObj;/*.....SomeOperationHere...*/for(MAPTYPE::iteratoritr
谁能告诉我vector和deque之间有什么区别。我知道vector在C++中的实现,但不知道双端队列。map和set的接口(interface)也与我相似。两者之间有什么区别以及何时使用一个。 最佳答案 std::vector:一个动态数组类。内部内存分配确保它总是创建一个数组。当数据的大小已知并且已知不会经常更改时很有用。当您想随机访问元素时,它也很好。std::deque:双端队列,既可以充当栈也可以充当队列。当您不确定元素的数量以及访问数据元素总是以串行方式时非常有用。它们在前端和末端添加/删除元素时速度很快,但在中间添加/
我最近发现了优秀的库boost::accumulators,我想用它来代替我的一些累加统计的代码。我在文档中找不到的一件事是对两个累加器集求和的能力,如operator+=例子:usingnamespaceboost::accumulators;typedefaccumulator_set>AccumSet;classFoo{AccumSetacc;public:Foo&operator+=(constFoo&that){this->acc+=that.acc;//error!nosuchoperatorreturn*this;}doubleGetVariance(){returnva
我有一组指针。在第一步中,我插入数据指针,在第二步中,我遍历整个集合并对元素进行一些处理。顺序并不重要,我只需要避免重复,这对指针比较很有效。我的问题是,出于相同目的使用无序集是否有利。无序集的插入速度更快吗? 最佳答案 正如AmiTavory评论的那样,如果您不需要订单,那么通常最好使用未排序的容器。原因是如果顺序以某种方式提高了性能,无序容器仍然可以自由使用它,因此无论如何都能获得相同或更好的复杂性。无序集合的一个缺点是它们通常需要针对键类型的哈希函数。如果制作一个太难或太贵,那么不使用哈希的容器可能会更好。在C++的标准库中,
我想知道是否有办法在定义为std::set的两个结构之间进行交叉或区分和std::map使用标准算法(如std::set_intersect)问题是我需要计算map的集合和键集之间的差异,但我想避免重新分配它(因为它是每秒对大型数据结构进行多次的操作)。有没有办法获得std::map的“关键View”??毕竟我正在寻找的是在执行设置操作时只考虑键,所以从实现的角度来看应该是可能的,但我还没有找到任何东西。 最佳答案 您可以使用transform_iterator来自boost以适应std::map迭代器并仅返回键:#include#
我正在尝试解决以下问题。假设我在C++中有以下容器:std::set>my_container;这个集合(字典)是按照顺序排序的在std::pair,这是字典顺序。我的任务是在my_container中找到任何元素其第一个坐标等于x,并将迭代器返回给它。显然,我不想使用find_if,因为我需要在对数时间内解决这个问题。如果有任何关于如何做到这一点的建议,我将不胜感激 最佳答案 您可以使用lower_bound为此:autoit=my_container.lower_bound(std::make_pair(x,std::numer