草庐IT

STD_PROP_LIST

全部标签

c++ - std::vector 本身的地址稳定吗?

如果我获取std::vector的地址,并且它在插入元素后重新分配,我可以假设它的地址没有改变吗?谢谢。 最佳答案 是的,在C++中你可以安全地假设。但是,第一个元素的地址&x[0]可以改变,那些地址是不一样的。编辑:当然其他元素的地址也是一样。顺便说一下,第一个元素的地址是否可能保持或多或少的稳定取决于whetherornotthegrowthfactorofthearrayislessthanthegoldenratio。,这是了解IMO的一个非常酷的事实。 关于c++-std::v

c++ - std::unique_lock::release 的用例是什么?

在什么情况下会使用std::unique_lock的release方法?我错误地使用了release方法而不是unlock方法,我花了一段时间才明白为什么下面的代码不起作用。#include#include#include#include#includestd::mutexmtx;voidfoo(){std::unique_locklock(mtx);std::coutthreads;for(inti=0;i 最佳答案 它在thisanswer中有很好的用途其中锁定状态的所有权明确地从函数本地unique_lock转移到外部实体(通

c++ - `std::string::begin()`/`std::string::end()` 迭代器失效?

#include#includeintmain(){std::strings="abcdef";std::strings2=s;autobegin=const_cast(s2).begin();autoend=s2.end();std::cout此代码将begin()const的结果与end()的结果混合在一起。这些函数都不允许使任何迭代器失效。但是我很好奇end()不使迭代器变量begin无效的要求是否实际上意味着变量begin可用于结束。考虑一个C++98,std::string的写时复制实现;非常量begin()和end()函数导致复制内部缓冲区,因为这些函数的结果可用于修改字符

c++ - 无法使用 MPI_Send 和 MPI_Recv 发送 std::vector

我正在尝试使用MPI发送和接收函数发送std:vector但我没有到达任何地方。我收到类似的错误FatalerrorinMPI_Recv:Invalidbufferpointer,errorstack:MPI_Recv(186):MPI_Recv(buf=(nil),count=2,MPI_INT,src=0,tag=0,MPI_COMM_WORLD,status=0x7fff9e5e0c80)failedMPI_Recv(124):Nullbufferpointer我尝试了多种组合A)就像用来发送数组的..std::vectorm_image_data2;//definitionof

c++ - std::unique_lock 和 std::condition_variable 如何工作

我需要弄清楚lock和condition_variable是如何工作的。在此处的-稍微修改过的代码中cplusplusreferencestd::mutexm;std::condition_variablecv;std::stringdata;boolready=false;boolprocessed=false;voidworker_thread(){//Waituntilmain()sendsdatastd::unique_locklk(m);cv.wait(lk,[]{returnready;});//afterthewait,weownthelock.std::coutlk(m

c++ - 如何避免 std::vector 在(重新)分配时复制?

我刚刚在向其添加新元素时遇到了std::vector的问题。似乎当你试图向它添加更多元素时,它需要分配更多空间,它通过复制它当前拥有的最后一个元素所有元素来实现。这似乎假设vector中的任何元素都是完全有效的,因此复制总是成功的。在我们的例子中,这不一定是真的。目前我们可能在vector中有一些遗留元素,因为我们选择不删除它们,它们是有效的对象,但它们的数据不能保证有效的行为。对象有守卫,但我从未考虑过向复制构造函数添加守卫,因为我认为我们永远不会复制无效对象(vector强制):CopiedClass::CopiedClass(constCopiedClass&other):mem

c++ - std::unique_ptr 试图引用已删除的函数

我已经使用Unity一段时间了,然后回来使用VisualStudio2015做一些C++。我遇到了这个类定义classA{public:A();virtual~A();A(constA&)=delete;A&operator=(constA&)=delete;private:…}这个类是动态分配的,如下所示:ObjPtrobj=ObjPtr(newA());哪里ObjPtr是定义的类型,看起来像:typedefstd::unique_ptrobjPtr;并将这些创建的对象添加到std::vector使用std::move.有一次,我需要遍历对象列表,如果我找到满足我条件的对象,请保留一

c++ - 普通默认可构造的 std::optional 和 std::variant

可以设计吗std::optional(当前std::experimental::optional)以这种方式,对于普通的默认可构造类型T对应std::optional也是默认可构造的吗?同样的问题重新阅读std::variant及其积分判别器。我自己的回答是:“不行,不能这么设计,因为如果对象有自动存储期,或者是非reinterpret_cast-ed,默认初始化时得到的它的整数鉴别器的值是不确定的-零初始化存储。”要求用户每次都进行值初始化在我看来是不允许的。 最佳答案 您的回答是正确的:不能。规范要求在默认构造时将其“初始化标志

c++ - 用户定义类型的 std::common_type 特征

自C++11以来,引入了类型特征std::common_type。std::common_type确定其所有模板参数之间的公共(public)类型。在C++14中,还引入了辅助类型std::common_type_t以缩短使用std::common_type类型特征的代码。std::common_type在重载算术运算符中特别有用,例如,templatestd::common_type_toperator+(T1const&t1,T2const&t2){returnt1+t2;}如果它的模板参数是内置类型(例如,int、double),它会工作得很好。但是,如果我将用户定义的类型作为模

c++ - 线程安全标准 :list C++

我是多线程的新手,我正在尝试简单地使一些std:lists线程安全。每当将项目添加到列表或从列表中删除时执行mutex.lock()和mutex.unlock()就足够了吗?同样,我只是想让它们成为线程安全的。谢谢 最佳答案 为了安全起见,您必须保护对列表的所有访问。虽然在没有锁的情况下从列表中读取不会损坏列表,但如果在另一个线程正在读取列表时修改了列表,则任何一个线程都可能损坏(即崩溃或产生不正确的结果)。您必须对您希望内容稳定的整个代码范围保持锁定。如果另一个线程可以随时删除或重新排序任何元素,那么这包括您对其内容具有实时迭代器