草庐IT

c++ - 根据键值从 multimap 中删除元素?

我如何从std::multimap中删除键小于或等于20的所有元素?我知道如何删除,我不知道如何传入条件“keylessthan20”。 最佳答案 下一个代码应该可以工作:std::multimapM;//initializeMhereautoit=M.upper_bound(20);M.erase(M.begin(),it);只需使用upper_bound然后erase. 关于c++-根据键值从multimap中删除元素?,我们在StackOverflow上找到一个类似的问题:

c++ - set::key_comp 与 C++ 中的 set::value_comp?

在C++中,set::key_comp与set::value_comp有什么区别?转到cplusplus.com页面没有显着差异。此外在set::key_comp和相关的set::value_comp页面上最后一句是“(...)key_comp和它的兄弟成员函数value_comp是等价的。”例子几乎一样:http://www.cplusplus.com/reference/set/set/key_comp/http://www.cplusplus.com/reference/set/set/value_comp/ 最佳答案 key

c++ - 使用 std::for_each 遍历树

我对使用algorithm还很陌生和functional在C++中。我需要进行树遍历并为每个元素执行一个函数。请参阅下面的代码。这行得通,但我有一些我不喜欢的东西,也许可以做得更好。请注意,我仅限于相当旧的g++(4.4.7)版本,无法使用lambda函数。我使用包装函数do_walk和std::bind调用成员函数walk在每个元素上。有没有办法避开包装函数,直接调用成员函数?我为回调函数使用了typedefUnaryFunction.我更愿意使用walk的模板化版本.但是,当我更改代码以使用模板时,出现以下编译错误:error:nomatchingfunctionforcallto

c++ - 在可变参数模板中实现 STL 函数

我一直在做一个小项目来跟上可变参数模板的速度。我实现了一个小的多维数组。我现在想定义一个对给定位置的最近邻居进行操作的函数——是否有一种优雅的方法来检索数组中给定位置的邻居的值?templatestructMArr{typedefstd::array::type,size>type;std::array,size>data;MArr&operator[](inti){returndata[i];}};templatestructMArr{typedefstd::arraytype;typedata;T&operator[](inti){returndata[i];}};附录:我有点清楚

c++ - MSVC std::pair 实现:SFINAE 是否在此处正确应用?

考虑以下std::pair的代码MicrosoftVisualStudio15.4.5附带的STL实现的默认构造函数:template::value&&is_default_constructible::value>>constexprpair():first(),second(){//defaultconstruct}我设置了/std:c++latest选项,所以,根据标准(我在这里使用草案n4659)我希望如果_Ty1中的任何一个,这个构造函数将被排除在重载决议之外。或_Ty1不是默认可构造的:23.4.2Classtemplatepair[pairs.pair]EXPLICITc

c++ - 你能初始化 unique_ptr 的 "static const vectors"吗? (C++17 与 GCC 7.3)

我正在尝试创建一个staticconst默认对象(规则)的列表太大而不能经常复制,因此我想将它们存储在vector中的unique_ptr.我注意到类似的问题已经进行了几次,但我不清楚这是否真的可行(我倾向于不可行)。即你不能使用initializer_list与unique_ptr因为对成员的访问是const导致复制操作。您不能通过引用传递临时变量,从而导致复制操作。因此两者:staticconststd::vector>kStrings={std::unique_ptr(newstd::string("String1")),std::unique_ptr(newstd::strin

c++ - 为什么 std::set 中的项目不能为 'popped' ?

我知道std::set不允许非常量访问它的项。我知道不可能将项目移出集合——因为任何类型的非常量访问都可能破坏集合的顺序。但是,我们可以从集合中删除一个项目。这不会破坏它,因为它只是迫使集合进行重组。那么为什么我们不能“弹出”一个项目呢?为什么我不能取出项目并同时将其删除?我问的原因是-我需要一个有序的unique_ptrs容器。有时我需要从一个容器中“弹出”unique_ptr并将它们转移到另一个容器中。它们必须是我制作的自定义仿函数。我不明白为什么不允许弹出功能? 最佳答案 要从std::set中提取节点,您可以使用extrac

C++/STL 我应该使用哪种算法来检查容器是否有重复项?

是否有任何STL算法可以判断容器是否具有重复元素(使用operator==或给定谓词)?让我们考虑这两个vector:std::vectorv1{1,2,3};std::vectorv2{1,2,1};我希望有这样的功能:std::is_exclusive(v1.begin(),v1.end());//returningtruestd::is_exclusive(v2.begin(),v2.end());//returningfalse有这么简单的功能吗?我找不到任何(找到std::unique,但这会修改​​vector...)注意:我不是在问如何“检查容器是否有重复项”,我知道我该

c++ - 带谓词的 std::map 与初始化列表

我有一个std::map使用自定义谓词:structPredIgnoreCase{booloperator()(conststd::string&str1,conststd::string&str2)const{std::stringstr1NoCase(str1),str2NoCase(str2);std::transform(str1.begin(),str1.end(),str1NoCase.begin(),tolower);std::transform(str2.begin(),str2.end(),str2NoCase.begin(),tolower);return(str1

c++ - 使用具有未定义行为的(STL)拷贝?

在评估中,我选择了选项LINEI上的运行时错误。没有未定义行为这样的选项,尽管我认为这是正确的选择。我不确定,但我认为评估有误。我编译并运行了该程序,它确实打印了3,9,0,2,1,4,5,使用三个不同的编译器(Cpp.sh,here和本地MacOSX).程序是否因LINEI存在未定义行为?#include#include#includeusingnamespacestd;voidprinter(inti){coutv1(mynumbers,mynumbers+7);copy(mynumbers,mynumbers+7,v1.end());//LINEIfor_each(v1.begi