草庐IT

set_charset

全部标签

c++ - 是否可以将项目从 std::set 中移出?

如果我有一个只允许移动语义的对象——是否可以从集合中移动项目?我似乎无法找到执行此操作的方法。 最佳答案 C++17添加了一个函数std::set::extract允许将对象移出集合:std::sets;s.emplace(arg0,arg1,arg2);//onlywaytoinsertsuchmove-onlyobjects,sinceC++11autointernal_node=s.extract(s.begin());//internal_nodenolongerpartofset,wecandowithitwhatwewa

c++ - O(logn) 中 std::set begin() 和 std::set 迭代器之间的距离

我需要在std::set中找到一个元素的索引。该索引可以可视化为迭代器距起点的距离。一种方法可以是:for(inti=0,set::iteratorit=s.begin();it!=iteratorToBeFound;++it,++i);这显然需要O(n)的时间。但是我们知道,set内部实现的二叉搜索树到根的距离可以在O(logn)时间内找到。他们有什么方法可以实现在C++集合中以O(logn)时间查找索引吗? 最佳答案 您可以使用函数std::set::find搜索元素x并计算distance到集合的第一个迭代器。std::dis

c++ - std::set,lower_bound 和 upper_bound 是如何工作的?

我有一段简单的代码:#include#includeusingstd::set;intmain(intargc,charargv){setmyset;set::iteratorit_l,it_u;myset.insert(10);it_l=myset.lower_bound(11);it_u=myset.upper_bound(9);std::cout这会打印1作为11的下限,10作为9的上限。我不明白为什么要打印1。我希望使用这两种方法来获取给定上限/下限的一系列值。 最佳答案 来自cppreference.com在std::se

c++ - “no match for ' operator< '” 尝试插入到 std::set 时

我正在使用gcc4.3.3尝试编译以下代码:structtestStruct{intx;inty;booloperatorsetti;setti.insert(testStruct(10,10));return0;}我得到这个错误:/usr/include/c++/4.4/bits/STL_function.h|230|错误:‘__x我怀疑我没有像应该做的那样重载运算符,但我无法查明确切的问题。我在这里做错了什么? 最佳答案 运算符必须是const并且取一个const引用:booloperator

c++ - 为什么将 set::iterator 而不是 const_iterator 传递给函数会违反单一定义规则?

std::set的描述容器givenbycppreference.com最后包含此注释:Themembertypesiteratorandconst_iteratormaybealiasestothesametype.Sinceiteratorisconvertibletoconst_iterator,const_iteratorshouldbeusedinfunctionparameterliststoavoidviolationsoftheOneDefinitionRule.我不明白最后这句话。我的理解是一个集合不允许修改它的元素(如果你需要改变一个,你必须erase它然后inse

c++ - 在 Visual C++ 和 clang 中使用 C++11 unordered_set

我正在尝试在跨平台C++应用程序中使用std::unordered_set。它在Windows下的VisualC++中的编译和工作非常好,但在MacOSX下的clang上会产生致命的编译错误。我想知道为什么会发生这种情况,以及使它正常工作的正确方法是什么。示例代码:////Clangbuildcmdline://$clang++./set.cpp-Wall-Werror-Wfatal-errors-std=c++11-stdlib=libc++-oset.out//#include#includestructPoint{intx,y;Point(intx=0,inty=0){this-

c++ - 运行时错误 : map/set iterators incompatible

我在第8行遇到运行时错误“map/setiteratorsincompatible”。voidManager::Simulate(Military*military,Shalishut*shalishut,char*args[]){Simulation*simulation=Simulation::GetInstance();Time*time=Time::GetInstance();multimap::iteratoritTasks;itTasks=simulation->GetTasks().begin();while(itTasks!=simulation->GetTasks()

c++ - 列表容器上的 std::set_difference

我正在尝试调用set_difference函数,并将结果放在std::list中。理论上,可以在任何排序的容器上执行此操作,对吧?listv;listl1;listl2;list::iteratorit;//l1andl2arefilledherel1.sort();l2.sort();it=set_difference(l1.begin(),l1.end(),l2.begin(),l2.end(),v.begin());但是,v返回的是一个空列表。是因为我不能在列表容器上使用它吗? 最佳答案 这是因为v.begin()是一个空序列

c++ - std::vector 比 std::unordered_set 更快?

在我的自定义物理引擎中,最大的瓶颈是从空间分区(二维网格)获取所有物体并返回仅包含指向物体的唯一指针的集合的方法。templateboolcontains(constT&mContainer,constV&mValue){returnstd::find(std::begin(mContainer),std::end(mContainer),mValue)!=std::end(mContainer);}constvector&GridInfo::getBodiesToCheck(){bodiesToCheck.clear();for(auto&query:queries)for(auto

C++ std::set 为什么它是关联的?

为什么std::set定义为关联容器?我的意思是std::map是一个关联容器,因为它将一个值映射到一个键,但为什么它是一个集合? 最佳答案 23.4.6.1类模板集概述[set.overview]Asetsatisfiesalloftherequirementsof[..]anassociativecontainer(23.2.4)[...]因为它满足作为关联容器的所有先决条件,这些先决条件在23.2.4.中有所描述,并且不像“将键映射到值”那么简单。第二段甚至强调了这一点(或者更确切地说,强调它实际上是map和multimap比