草庐IT

c++ - 我可以依靠短路评估来检查 C++ 中的 vector 边界吗?

下面的代码可以接受吗?if(vector.size()>0&&vector[0]==3){}或者当vector为空时它有可能崩溃吗?我没有注意到这种情况,但我担心它仍然有可能发生。 最佳答案 是的,您可以依靠内置运算符&&来短路。这是其规范的一部分。 关于c++-我可以依靠短路评估来检查C++中的vector边界吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/13980755

c++ - vector 迭代器在 for 循环中不可取消引用

我正在使用一个循环来计算一个词被输入了多少次然后打印这个词以及它被输入了多少次,这有效但它从不打印最后一个词,我将它按字母顺序排序。在打印最后一个字之前,它会错误地指出迭代器不可取消引用。这是我的循环代码:for(vector::iteratorit=v.begin();it!=v.end();++it){if(*it==*(it+1)){count++;}elseif(*it!=*(it+1)){count++;cout 最佳答案 你的代码有未定义的行为-假设it指向v的最后一个元素,然后你试图取消引用v.end()*(it+1)

c++ - C++11 中的值初始化对象和 std::vector 构造函数

在C++中,使用C数组而不是std::vector的理由很少。至少对于C++03来说,这几个令人信服的原因之一是不可能使用vector来分配未初始化的对象数组。std::vector的“填充”构造函数是:vector(size_typecount,constT&value=T())意思是……int*array=newarray[1000000];可能比:更有效率std::vectorv(1000000);...因为vector构造函数必须对整数数组进行零初始化。因此,在处理PODvector时,没有真正等同于malloc;您可以获得的最好结果相当于calloc。C++11似乎改变了这一

c++ - 在不释放内存的情况下销毁 std::vector

假设我有一个函数可以将数据放入标准vector中:voidgetData(std::vector&toBeFilled){//Pushdatainto"toBeFilled"}现在我想将这个数据发送到另一个函数,完成后应该释放数据:voiduseData(int*data){//Dosomethingwiththedata...delete[]data;}两个函数(getData和useData)都是固定的,不能更改。这在复制数据一次时工作正常:{std::vectordata;getData(data);int*heapData=newint[data.size()];memcpy(

c++ - 使用 memcpy 将 std::vector 复制到 protobuf 的重复字段

起初我有这个简单的protobuf文件messagemessagetest{...repeatedfloatsamples=6;....}用这个方法创建一个头文件//repeatedfloatsamples=6;inlineintsamples_size()const;inlinevoidclear_samples();staticconstintkSamplesFieldNumber=6;inlinefloatsamples(intindex)const;inlinevoidset_samples(intindex,floatvalue);inlinevoidadd_samples(

c++ - std::vector 元素中的常量引用

这只是我的编译器还是禁止在std::vector元素中使用cons引用。考虑以下结构:structY{constint&x;Y(constint&p_x):x(p_x){}};现在,当我尝试将此类对象推到vector上时:std::vectoryv;intx=5;Yy(x);yv.push_back(y);我收到编译器错误:“错误:非静态引用成员‘constint&Y::x’,不能使用默认赋值运算符”。复制ctor还不够吗? 最佳答案 vector元素必须是可赋值的。来自C++标准的23.2.4类模板vector部分:...thes

C++ vector ,返回与参数

这个问题在这里已经有了答案:关闭12年前。PossibleDuplicate:howto“returnanobject”inC++我想知道以下三种方法之间是否存在差异:voidFillVector_1(vector&v){v.push_back(1);//lotsofpush_backs!}vectorFillVector_2(){vectorv;v.push_back(1);//lotsofpush_backs!returnv;}vectorFillVector_3(){inttab[SZ]={1,2,3,/*...*/};returnvector(tab,tab+SZ);}

c++ - 对于可 move 类型,删除 std::vector 中间的元素仍然很昂贵吗?

通常认为删除std::vector中间的元素代价高昂,因为它需要复制它之后的每个元素来填充空洞。在C++11中,std::vector将向下move所有元素,这应该非常快(如果仅与拷贝相关),至少我是这么认为的。当然,它在时间上仍然是线性的,但总的来说它应该比旧版本更快。这是真的吗?我再也不用担心删除中间的某些对象了吗? 最佳答案 这取决于vector中的内容。如果它是POD或指针,我无法想象它会有什么不同。如果类实例复制起来很繁重,但可以非常快速地move,我希望使用C++0x可以加速。但是,我认为如果从std::vectors中

c++ - 为什么删除移动构造函数会导致 vector 停止工作

如果我在类中禁止移动构造函数,我就不能再在vector中使用它:classFoo{public:Foo(inti):i_(i){}Foo(Foo&&)=delete;inti_;};intmain(){std::vectorfoo;foo.push_back(Foo(1));}为什么会这样? 最佳答案 总结不要删除移动成员。假设您的编译器完全符合C++11,那么显式删除移动构造函数也将隐式声明以下内容:Foo(constFoo&)=delete;Foo&operator=(constFoo&)=delete;也就是说,如果您声明了一

c++ - 初始化 C++ vector 的大小

初始化C++vector和其他容器的大小有什么优点(如果有的话)?有什么理由不只使用默认的无参数构造函数吗?基本上,两者之间是否存在显着的性能差异vectorphone_book;和vectorphone_book(1000);这些示例来自BjarneStroustrup的TheC++ProgrammingLanguageThirdEdition。如果这些容器应该总是用一个大小来初始化,有没有一个好方法来确定一个好的开始大小是多少? 最佳答案 有几种方法可以创建vector与n元素,当您事先不知道元素的数量时,我什至会展示一些填充v