草庐IT

-std=gnu99

全部标签

c++ - 一些 STL 容器的 std::allocator 不匹配

使用不匹配的std::allocator特化(当然,除了它对void的特化)作为STL容器(不是所有容器)的模板参数在技术上是否有效,但下面列举的加上unordered_(multi)map/set)?以下代码编译正常。#include#include#include#include#includeintmain(){structA{booloperator>l;std::forward_list>fl;std::deque>d;std::set,std::allocator>s;std::multiset,std::allocator>ms;std::map,std::allocat

c++ - std::includes in c++ 算法的复杂性

std::includes算法采用两个排序范围并检查set2是否在set1中(即set2的每个元素是否包含在set1中)?我想知道为什么eel.is/c++draft说这个算法的复杂度至多是2·(N1+N2-1)比较?相同的声明在:1.cppreference2.cplusplus在我看来,它应该最多只有2·N1比较,最坏的情况是max(set2)>=max(set1)。 最佳答案 我同意你的结论。来自AkiSuihkonen'sanswer的交错集合示例是错误的,因为算法会尽快退出2.cppreference上的示例实现有一个递增

c++ - 使用 std::move 传入一个临时 lambda,或者向 "pull"输出一个临时参数,有什么区别?

我有以下(设计的)代码,其中我有一个带有单个打印函数的打印机类和一个处理字符串然后调用打印函数回调函数的工作类:#include#includeusingcallback_fn=std::function;classprinter{public:boolprint(std::stringdata){std::cout注意:我调用了两次std::move()...现在这有效(令我惊讶),但我两次调用都只是为了展示我是什么试。我的问题是:我是否应该在set_callback()函数中使用std::move()来“提取”温度,如果我使用它,是否真的有一个拷贝还是std::move()意味着它

c++ - std::cspan 发生了什么?

std::span已投票进入C++20。我假设与std::span一起,会有一个方便的别名定义如下:templateusingcspan=span;对我来说,这似乎是一个非常方便的别名。我可能会更频繁地使用cspan而不是span!根据cppreference,cspan不存在。在thispaper中提到了cspan这似乎暗示它在某个时候符合标准。我找不到任何其他提及。那么cspan发生了什么?它被删除了吗?它曾经存在过吗? 最佳答案 确实,cspan不存在也从未存在过。唯一的名称更改是span曾经拼写为array_viewP108

c++ - 如何将 boost::lambda 与 std::find_if 一起使用?

我有一个std::vector并且我想检查一个特定的属性每个元素。SomeStruct有一个属性“类型”。我想检查这个属性为Type1或Type2。我的计划是使用boost::lambda。std::vector::const_iteratorit=std::find_if(vec.begin(),vec.end(),_1.type==SomeStruct::Type1||_1.type==SomeStruct::Type2);因为我需要访问每个元素的特定属性,所以我不确定我是否可以完全使用boost::lambda。有什么提示吗? 最佳答案

c++ - 是否可以为每个循环删除 c++11 中 std::list 的元素

我想对每个循环使用新的C++11来迭代列表的所有元素并删除某些元素。例如std::listmyList;myList.push_back(1);myList.push_back(13);myList.push_back(9);myList.push_back(4);for(intelement:myList){if(element>5){//Dosomethingwiththeelement//erasetheelement}else{//Dosomethingelsewiththeelement}}是否可以使用foreach循环来完成此操作,还是我必须返回迭代器才能实现此目的?

c++ - std::成员函数的异步调用

考虑以下类:classFoo{private:voidbar(constsize_t);public:voidfoo();};现在Foo::foo()应该启动执行bar的线程,所以它是这样实现的:voidFoo:foo(){autohandle=std::async(std::launch::async,&Foo::bar,this,0);handle.get();}这对g++-4.6.3完美无缺,但对g++-4.5.2无效,错误信息是include/c++/4.5.2/functional:180:9:Error:mustuse».«or»->«tocallpointer-to-me

c++ - 如何访问 std::list 的第一个元素?

我有一个列表std::list*l;.此列表不为空且具有一些值。我的问题是如何正确访问项目?我不需要遍历列表。我只想要第一个项目。std::list::iteratorit=l->begin();if(it!=l->end()){//accessingTintvalue=(*it)->value();//Isthissafe?}或者我还应该检查null吗?if(it!=l->end()&&(*it)){//accessingTintvalue=(*it)->value();} 最佳答案 如果你被迫使用std::listmyList;

c++ - std::map<t1, t2>::erase(iterator position) 的工作?

我阅读了cplusplus.com通过将迭代器作为参数传递来删除std::map中元素的操作是常量时间。如果我没记错(请纠正我),迭代器基本上是指向map中元素的指针,带有++运算符,只返回当前元素的有序后继我想这就是遍历std::map时排序结果的实现方式。现在如果map是一棵红黑树,删除一个元素(使用它的地址)不应该是对数时间操作,我想知道他们是如何在恒定时间内完成的(除非有一个高度内存浪费的替代方案这样做)。 最佳答案 首先,我会对您从cplusplus.com获得的任何信息保持警惕;该网站已知有一些错误。来访cpprefer

c++ - 两个 std::atomic 可以成为一个 union 的一部分吗?

我想这样做:union{std::atomicu128;struct{std::atomicu64_1;std::atomicu64_2;};};多个线程将读取和写入union的两个部分。安全吗?编辑:我使用Linux,x86_64,clang3.3Edit2:我希望能够递增和递减u64_1,读取u64_2,并写入u128(compare_exchange)Edit3:如果我使用atomicbuiltinfunctions会怎么样??union将如下所示:union{uint128_tu128;struct{uint64_tu64_1;uint64_tu64_2;};};u64_1将映