草庐IT

c++ - std::logical_not 和 std::not1 之间的区别?

请举例说明何时使用std::logical_not以及何时使用std::not1!根据文档,前者是“一元函数对象类”,而后者是“构造一元函数对象”。所以最终两者都构造了一个一元函数对象,不是吗? 最佳答案 两者都是仿函数(具有operator()的类),但它们取反的内容略有不同:std::logical_not::operator()返回T::operator!().在语义上,它看到T作为一个值并将其取反。std::not1::operator()返回!(T::operator()(T::argument_type&)).在语义上,

c++ - 如何将 `std::array` 用作 `template<typename> class` 形式的模板参数?

请考虑以下tree类templateclassTuple>classtree{private:Tm_value;Tuplem_children;};templateusingstatic_tree=tree>;定义不明确。std::array不是Tuple的合适模板参数.我假设static_tree的意图清楚了。我们可以做类似的事情templatestructhelper{templateusingtype=std::array;};templateusingstatic_tree=tree::templatetype>;没有helper还有其他选择吗?类(class)?

c++ - 在所有 std::futures 完成之前从函数返回是否安全?

我有这样的代码:intfunction(){std::vector>futures;for(constauto&elem:elements){futures.push_back(std::async(&MyClass::foo,myClass,elem);}for(auto&f:futures){constintx=f.get();if(x!=0)returnx;}}当有未完成的异步调用时,我可以从函数中返回吗?我只对一个非零值感兴趣。我应该等到所有异步调用完成吗?这段代码安全吗? 最佳答案 std::future的析构函数(当通过

c++ - std::vector 中的二进制搜索

我正在尝试寻找vector元素在另一个vector中的位置。在这里,我有兴趣使用与binarysearch一样快的实现。我有不同的长度为100万或更长的vector,所以我正在尝试更快地实现某些目标。我的情况如下:1)我正在搜索的vector已排序。2)我正在搜索的元素将始终存在,即我没有notfound的情况,我想获得索引vector元素以更快的方式。我尝试了以下代码来获取vector元素的索引。#include#include#includetemplateIterbinary_find(Iterbegin,Iterend,Tval){Iteri=std::lower_bound(

c++ - 类的编译是如何工作的?

有很多关于编译/链接过程的引用资料,但我对一个更具体的问题感兴趣:类的编译。问题的出现是因为一般情况下,在使用之前必须了解事物。例如:如果之前没有声明过,则不能调用该函数。在类里面,它不是以同样的方式完成的。您可以在成员出现之前使用它。编译器做什么?该标准是否说明了前一阶段的编译?更具体地说,以下示例显示了我们如何使用下面定义的成员。#includeclassEvenOdd{public:EvenOdd():value(0){}voidassignEven(unsignedv){if(v>0&&v%2==1){std::cout0&&v%2==0){std::cout我们还可以添加有关

c++ - "if"语句对性能有多大影响?

有一些不同大小的IPTables(例如255或16384或512000!!)。每个表的每个条目都包含一个唯一的IP地址(十六进制格式)和一些其他值。IP总数为800万。所有IPTables的所有IP都排序我们需要每秒搜索IPTable300,000次。我们目前查找IP的算法如下://10_ipTable[i].start&&ip可以看出,在最坏的情况下,给定IP地址的比较次数为_rangeCount*2,“if”语句检查的次数为_rangeCount。假设我想更改searchIPTable并使用更有效的方法在IPTables中查找IP地址。据我所知,对于排序数组,二进制搜索等著名搜索算

C++:&(std::cout) 作为模板参数

为什么不能将std::cout的地址作为模板参数传递?或者,如果可能的话,怎么做?这是我尝试过的:#includetemplateclassMyClass{public:voiddisp(void){(*stream)MyObj;MyObj.disp();return0;}我从clang++-std=c++11得到的错误信息:main.cpp:15:11:error:non-typetemplateargumentdoesnotrefertoanydeclarationMyClassMyObj;^~~~~~~~~~~main.cpp:6:24:note:templateparamete

c++ - 传递派生类型列表,以便将它们存储为成员

我有一个类widget.我有一个抽象类base与衍生物derived_a,derived_b等我要widget保存从base派生的任意数量的对象以便以后多态地使用它们。我的第一次尝试是这样的:#include#include#include#includeclasswidget{public:explicitwidget(std::vector>&¶ms):members{std::move(params)}{}private:std::vector>members;};并且会这样调用:std::vector>v;v.push_back(std::move(std::make_

c++ - 带有 std::enable_if 和 std::is_default_constructible 的 SFINAE 用于 libc++ 中的不完整类型

我刚刚在使用SFINAE检测模板类型是否默认可构造时观察到libc++的一个奇怪问题。以下是我能够想出的一个最小示例:#include#includetemplatestructDummy;templatestructDummy{};templatestructhas_dummy:std::false_type{};templatestructhas_dummy>::value>>:std::true_type{};intmain(){std::cout{}(){}()它编译并输出预期的行true和false使用libstdc++使用g++或clang++编译时.但是,当我尝试使用li

c++ - std::initializer_list<int>({1,2,3}) 和 {1,2,3} 有什么区别?

我有以下模板函数:templatevoidfoo2(Tt){}我知道我不能使用以下方式调用它:foo2({1,2,3});因为初始化列表是模板参数的非推导上下文。我必须使用:foo2>({1,2,3});但我也可以使用:foo2(std::initializer_list({1,2,3}));这让我想知道之间有什么区别:{1,2,3}和std::initializer_list({1,2,3})? 最佳答案 Abraced-initlist不是表达式,因此没有类型。当你打电话时foo2({1,2,3});编译器不知道是什么类型{1,