草庐IT

std-ranges

全部标签

c++ - 分离的 std::thread 终止后是否需要删除?

我创建了一个newstd::thread对象,然后detach()它。线程运行任意时间,然后自行终止。由于我使用new创建了对象,我是否需要在某个时候delete来释放它的资源?还是线程在终止时有效地删除自身?如果它确实有效地删除自身,如果我在它终止后显式删除它,是否会发生不好的事情? 最佳答案 是的,你必须自己删除它。一旦您调用std::thread::detach,线程将与线程对象分离并允许独立执行,然后线程对象将不再拥有任何线程。所以线程不会也不可能在终止时删除它。 关于c++-分

c++ - std::map:它可以在插入键后复制和移动键吗?

换句话说,存储指向映射中的键的指针是否安全?或者map是否有可能在其生命周期内复制和移动键,从而使现有指针无效?文档说:“迭代器有效性:没有变化。”这是否意味着我的问题的答案是“不,它们不能被复制或移动”? 最佳答案 std::map容器模板提供了一个基于节点的容器,这意味着迭代器和对容器元素的引用永远不会失效,直到元素被从中删除map。因此,只要map处于事件状态并且元素仍在其中,您就可以将元素键地址分发给第三方。 关于c++-std::map:它可以在插入键后复制和移动键吗?,我们在

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++:&(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++ - 带有 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,

c++ - 如何测试 std::error_code 不是错误?

我有一个返回std::error_code的方法。我对错误消息不是特别感兴趣,只对方法是否成功感兴趣。测试std::error_code是否代表成功操作的最佳方法是什么? 最佳答案 我在使用ASIO库时遇到过类似的情况。作为什么oneoftheirblogposts建议,std::error_code应按如下方式进行测试:std::error_codeec;//...if(!ec){//Success.}else{//Failure.}深入挖掘后,我发现了this(最近)C++标准Google组中的讨论证实了上述说法,但也提出了关于