草庐IT

c++ - OpenMP 中的共享 vector

我正在尝试并行化我正在使用的程序并遇到以下问题。如果多个线程需要在同一个vector但vector的不同元素上读/写,我会失去性能吗?我觉得这就是我的程序在并行化后几乎没有变得更快的原因。采取以下代码:#includeintmain(){vectornumbers;vectorresults(10);doublex;//write10valuesinvectornumbersfor(inti=0;i显然实际程序执行的操作要昂贵得多,但是这个例子应该只解释我的问题。那么for循环是否可以快速且完全并行地完成,或者不同的线程是否必须相互等待,因为一次只有一个线程可以访问vector编号,例

c++ - 多重继承类的复制构造函数

考虑这段代码:#include#includeusingnamespacestd;classBase{char_type;public:Base(chartype):_type(type){}~Base(){coutv;Baseb('b');Childc;v.push_back(b);v.push_back(c);return0;}我系统的输出是:Basedestructor:bChilddestructorBasedestructor:cBasedestructor:bBasedestructor:bBasedestructor:c我的问题是:为什么Base(b类型)的析构函数被调用

c++ - 如何使队列上的推送和弹出成为原子操作,如何锁定这些操作?

我正在使用队列在两个线程之间进行通信(一个只是生成自定义类的实例并将指针推送到队列,另一个从自定义类的队列指针中读取并进行一些计算)。如何使队列上的推送和弹出成为原子操作,如何锁定这些操作?(我不能使用C++11标准) 最佳答案 可能最便携的非C++11锁定机制是synchronisztion来自Boost.Thread的类型图书馆。特别是mutex类为您提供了一个简单的可锁定对象,用于授予对资源的独占访问权限。例如:#include#includetemplateclasslocking_queue{public:voidpush

c++ - std::initializer_list 的底层结构是什么?

第一部分:std::initializer_list是C++11的一个非常有用的特性,所以我想知道它是如何在标准库中实现的。从我读到的here,编译器创建一个T类型的数组并给出指向initializer_list的指针.它还声明复制initializer_list将创建一个引用相同数据的新对象:为什么会这样?我会猜到它要么:为新的initializer_list复制数据将数据的所有权转移到新的initializer_list第二部分:来自std::vector的众多在线引用资料之一构造函数:vector(initializer_listil,constallocator_type&al

c++ - std::find 的优点

与容器的find方法相比,使用C++11的std::find有什么优势吗?在std::vector的情况下(没有find方法)std::find使用一些智能算法或简单地迭代每个元素的天真方法?在std::map的情况下,您似乎需要传递一个std::pair,即value_typestd::map的。这似乎不是很有用,因为通常您希望查找键或映射元素。std::list或std::set或std::unordered_set等其他容器呢? 最佳答案 Inthecaseofstd::vector(whichdoesnothaveafind

c++ - 为什么 std::vector 这么快(或者我的实现太慢了)

前几天我在玩游戏,想看看我能优化到什么程度。我决定从一个简单的map开始,它只进行线性搜索以查找元素是否存在,然后尝试优化其中的大部分内容。此外,为了进行比较,我使用std::find对std::map和std::vector执行相同的操作。map的结果是预期的,创建和销毁比我的map慢,但速度快得多(实际上,我一直无法测量它,它总是返回0)。问题在于std::vector。我预计它会比我的实现慢,但事实并非如此,而且我真的不明白它怎么可能相同或更快,因为我的实现跳过了最坏的情况(值不在vector中)并且是使用结果缓存。任何人都可以在这里阐明一些问题吗?我知道STL背后的家伙是半神,

c++ - 返回 vector 比通过引用传递慢吗?

在过去,我们被训练使用通过引用传递的结果参数,以避免不必要地复制数据。然而,对于更智能的编译器——尤其是C++11的扩展,是否仍然需要?具体来说,现代C++11/C++14编译器在2018年是否有任何理由(仍然)使用voidFilter(vector&elements,vector&outElements);而不是简单地返回vector,即vectorFilter(vector&elements);提前感谢所有见解! 最佳答案 andparticulartheextensionstoC++11isthisstillrequired?

c++ - 如何实现类似 std::copy_if 但在插入到不同容器之前应用函数的方法

完全公开,这可能是一个锤子和钉子的情况,在不需要的时候尝试使用STL算法。我在我正在使用的一些C++14代码中看到了一个重新出现的模式。我们有一个迭代的容器,如果当前元素符合某些条件,那么我们将其中一个元素字段复制到另一个容器。模式是这样的:for(autoit=std::begin(foo);it!=std::end(foo);++it){autox=it->Some_member;//Note,thecheckusuallyusesthefieldwouldaddtothenewcontainer.if(f(x)&&g(x)){bar.emplace_back(x);}}这个想法几

c++ - 为什么 nullptr 是核心语言的一部分,而 nullptr_t 是 STL 的一部分?

据我所知nullptr是核心语言的一部分。引用C++11:(18.2/9)nullptr_tisdefinedasfollows:namespacestd{typedefdecltype(nullptr)nullptr_t;}并在header中定义. 最佳答案 因为它可以。C++标准化过程的一个中心目标是在向语言添加内容时尽可能少地改变核心语言。nullptr篡改了0的用法来表示空指针和,呃,零。由于显而易见的原因,使用0导致问题,f(0)调用f(int)还是f(int*)?于是在核心语言中加入了一个全新的字面量:nullptr。它

c++ - 对指针列表进行排序

我又一次发现自己在使用C++完成一些非常简单的任务时失败了。有时我希望我可以从Java中的OO中学习我所知道的一切,因为我的问题通常是从像Java一样思考开始的。无论如何,我有一个std::list我想排序。假设BaseObject是:classBaseObject{protected:intid;public:BaseObject(inti):id(i){};virtual~BaseObject(){};};我可以对指向BaseObject的指针列表进行排序带有比较器结构:structComparator{booloperator()(constBaseObject*o1,const