草庐IT

unordered-set

全部标签

c++ - 无需默认构造函数即可插入或更新到 unordered_map

我有一个std::unordered_map,我想向其中添加一个键值对。如果该key尚不存在,那么我希望它添加给定的值。如果key已经存在,那么我希望更新值。这里的标准建议似乎是使用operator[]。但这要求映射的值类型是可默认构造的。我希望避免提供默认构造函数。我该怎么办? 最佳答案 您应该使用insert_or_assign(C++17)如cppreference所示在这种情况下你不需要有默认的可构造对象:insert_or_assignreturnsmoreinformationthanoperator[]anddoesn

c++ - 如果有插入/删除/重新哈希操作,unordered_map 是否复制/释放包含的对象?

我想在unordered_map中存储小对象,只是想知道如果有任何插入/删除/重新哈希操作,它是否可以复制/释放包含的对象?我认为unordered_map使用链接列表来存储键/值对,它不应该需要复制/释放像vector这样的对象来重新分配内存。 最佳答案 C++11标准:§23.2.5/8Theelementsofanunorderedassociativecontainerareorganizedintobuckets.Keyswiththesamehashcodeappearinthesamebucket.Thenumbero

c++ - 在 std::set 或 std::map 的键中使用 weak_ptr 是否安全

今天有很多关于std::weak_ptr和std::owner_less以及它们在关联容器std::set和std::map。有许多帖子指出在std::set中使用weak_ptr是不正确的,因为如果弱指针过期,它将是未定义的行为。这是正确的吗? 最佳答案 原因之一std::owner_lessexists是为了提供这种排序,并在存在过期弱指针的情况下保证其安全。我的逻辑是一、std::owner_less的定义operator()definesastrictweakorderingasdefinedin25.4undertheeq

c++ - 运行 boost bcp 工具时出错 : "The Boost path appears to have been incorrectly set"

尝试运行Boost的bcp工具时,出现以下错误:****exception(205):std::runtime_error:TheBoostpathappearstohavebeenincorrectlyset:couldnotfindboost/version.hppin********errorsdetected;seestandardoutputfordetails********错误消息与上面完全一样,它尝试搜索的路径为空。我尝试通过设置BOOST_ROOT环境变量来解决它,但同样的错误又回来了,搜索到的路径仍然是空的。系统为MacOSX10.9.1。

c++ - 散列指针作为 C++ STL 中 unordered_map 的键

我发布了一个类似的quetion关于在C++STL中使用指针作为map上的键。当用作键时,指针如何在unordered_maps中散列。更具体地说,如果我定义:std::unordered_mapfoo;默认的C++std::hash实现是否可以处理这些指针?使用安全吗?这是好的做法吗? 最佳答案 std::hash已定义,但其操作方式的细节取决于实现。使用它肯定是安全的,我认为这是一个很好的做法-只要它是您需要作为键的指针,而不是对象内容本身。 关于c++-散列指针作为C++STL中u

c++ - 如何获取 std::unordered_map 的最后一个元素?

如何获取std::unordered_map的最后一个元素?myMap.rbegin()和--myMap.end()是不可能的。 最佳答案 容器中没有无序的“最后一个元素”。您可能需要一个有序的容器,例如std::map并使用mymap.rbegin()->first访问最后一个元素(另见thispost)编辑:要检查您的迭代器是否会到达末尾,只需递增它(并可能将其保存在临时文件中)并根据mymap.end()检查它,或者,甚至更干净:if(std::next(it)==last) 关于

c++ - 如何根据 `std::vector` 中的元素对 `std::set` 进行切片

有没有一种根据std::set中的元素对std::vector进行切片的好方法?换句话说,std::set中的元素包含我想要在vector中的索引。当然,我可以用代码完成这个:#include#include#include#includetemplatestd::vectorslice(std::vectorconst&x,std::setconst&I){autoy=std::vector();for(autoconst&i:I)y.push_back(x[i]);returny;}intmain(){autox=std::vector{1.2,2.3,3.4,4.5,5.6};a

c++ - 为什么我不能将 std::function 用作 std::set 或 std::unordered_set 值类型?

为什么我不能有std::set或std::function的std::unordered_set?有什么办法让它正常工作吗? 最佳答案 您可以很好地创建一个std::set的功能。问题在于集合需要在其元素的值之间存在绝对顺序。此顺序由比较器定义,然后用于对集合的元素进行排序,检查元素是否已存在,并找到特定元素。不幸的是,函数之间不存在顺序。假设您有两个函数f1()和f2(),f1的含义是什么??此外,平等并没有真正定义。例如,如果您有intfun1(int){return1;}intfun2(int){return1;}functi

c++ - 为什么 std::remove 不能与 std::set 一起使用?

以下代码:#include#include#includestd::sets;intmain(){s.insert(1);s.insert(2);std::remove(s.begin(),s.end(),1);}不能用gcc4.7.2编译:$LANG=Cg++test.cppInfileincludedfrom/usr/include/c++/4.7/algorithm:63:0,fromtest.cpp:3:/usr/include/c++/4.7/bits/stl_algo.h:Ininstantiationof'_FIterstd::remove(_FIter,_FIter,c

c++ - 如何在 std::set 中查找具有特定字段值的对象?

我调用了一个返回std::setconst&的方法其中T是一个类类型。我想要实现的是检查集合是否包含T类型的对象具有自动化测试中断言的特定字段值。应该对多个对象进行此检查。这是一个简单的例子:让类型T是Car举个例子set包含一堆汽车。现在我想在该集合中找到一辆具有特定颜色和特定门数和特定最高速度的汽车。如果找到那辆汽车,则第一个断言为真,应该找到具有其他字段值的下一辆车。我不允许更改T的实现.使用Boost就OK了。你会怎么做? 最佳答案 这取决于T的实现.让我们坚持你的类的例子Car.假设该类看起来像这样:classCar{pu