草庐IT

look_back

全部标签

c++ - std::vector::push_back 不可复制对象给出编译器错误

我在g++(GCC)4.7.2上遇到编译错误但不在MSVC-2012当试图std::vector::push_back不可复制(私有(private)复制构造函数)但可移动的对象。对我来说,我的示例看起来与SO和其他地方的许多其他示例相同。错误消息使它看起来像是结构不是“可直接构造”的问题-我不知道这意味着什么,所以我加倍不确定为什么对象需要“可直接构造”才能被推回。#include#includestructMyStruct{MyStruct(std::unique_ptrp);MyStruct(MyStruct&&other);MyStruct&operator=(MyStruct

c++ - 为什么 push_back 有两个左值和右值重载?

为什么一个类/函数会有两个重载,一个用于左值,一个用于右值?例如,来自this视频,它说我们有两个重载vector::push_backvoidpush_back(constT&value);voidpush_back(T&&value);为什么我们不能只有一个值重载,voidpush_back(Tvalue);如果它是一个左值,值将被复制,如果它是一个右值,值将被move。这不是标准的工作方式和保证方式吗? 最佳答案 根据您的按值提议,技术上会有复制+move或move+move,而对于其他两个重载,只有一个拷贝或一个move。

c++ - 在 push_back pop_front 场景中是否需要使用互斥锁锁定 STL 列表?

我有一个线程后推到STL列表,另一个线程从列表中弹出。在这种情况下我需要用互斥量锁定列表吗? 最佳答案 来自SGI'sSTLonThreadSafety:Ifmultiplethreadsaccessasinglecontainer,andatleastonethreadmaypotentiallywrite,thentheuserisresponsibleforensuringmutualexclusionbetweenthethreadsduringthecontaineraccesses.由于您的两个线程都修改了列表,我想您必

c++ - push_back 如何在 STL vector 中实现?

我在一次采访中被问到这个问题。我回答的点是这样的1)指向当前位置的索引;2)必要时调整大小。谁能详细说明一下? 最佳答案 STLvector有一个size(当前存储元素的数量)和capacity(当前分配的存储空间)。如果size,一个push_back简单地将新元素放在末尾并递增size1.如果size==capacity在push_back之前,分配了一个新的更大的数组(两倍大小是常见的,但这是依赖于实现的afaik),所有当前数据都被复制(包括新元素),并释放旧分配的空间。如果分配失败,这可能会引发异常。操作的复杂性是摊销O(

c++ - vector::emplace_back 与 shared_ptr 的用法

#include#include#includeusingnamespacestd;structBinaryTree{intelement;shared_ptrleft;shared_ptrright;};intmain(){vector>vecBT;//caseIvecBT.emplace_back(newBinaryTree{10,nullptr,nullptr});//caseIIvecBT.emplace_back(shared_ptr(newBinaryTree{20,nullptr,nullptr}));return0;}http://en.cppreference.com

c++ - vector.emplace_back() 和 vector.push_back() 做同样的事情吗?

所以我试图将整数添加到我的vector的背面,并错误地认为push_back()将新数据添加到vector的前面(又名vector[0])。我在Xcode中做了一个测试,并针对emplace_back()测试了push_back()并得到了相同的结果。我以为他们是不同的,但这让我觉得也许他们做同样的事情。如果是这样,为什么vector有不同的方法?这是我的代码,以防我这样做:#include#includeusingnamespacestd;intmain(intargc,constchar*argv[]){//forpush_backvectorpush;push.push_back

c++ - 为什么 std::vector::push_back 需要赋值运算符

std::vector::push_back(constT&value)根据this要求类型T是CopyInsertable.但是,除非我提供公共(public)赋值运算符,否则使用失败(clang、GCC、Visual;均没有c++11)编译以下程序。#includeclassA{A&operator=(constA&rhs);//private!!};intmain(){std::vectorv;Aa;v.push_back(a);}为什么我需要提供这个赋值运算符,我的印象是复制构造就足够了。附言我在标准中找不到定义这个的地方,所以如果你能指出引用,我将不胜感激

c++ - __mm128 的 vector 不会 push_back()

这个简单的SSE代码:#include#includeintmain(){std::vectorblah;blah.push_back(__m128());}在MSVC10上崩溃并在0xffffffff处出现段错误。可能出了什么问题? 最佳答案 std::vector不分配特殊对齐的内存,__m128需要用它来存储它的数据。您将不得不换出分配器,或者将其替换为4个float的数组,然后在每次访问vector时执行未对齐的加载或复制到对齐的位置。 关于c++-__mm128的vector不

c++ - push_back() 之后 vector 的容量发生变化

有人可以解释为什么我没有得到相同的输出吗?ma​​in.cpp:#include#includeusingnamespacestd;structCell{vectorvtx;};intmain(){vectorcells;Celltmp;tmp.vtx.reserve(5);cells.push_back(tmp);cout输出:50 最佳答案 因为获取vectorA并将其复制到vectorB并不能保证vectorB与vector具有相同的容量>一个。通常,新vector只会分配足够的内存来容纳要复制到其中的元素。事实上,有一个古老

C++ STL vector : Push_back taking reference

从std::vector的cpp文档中,我看到了这一点:voidpush_back(constT&x);我知道push_back复制了我传递的对象。但是,为什么签名是constT&?通过查看这个,我最初认为它需要一个const引用我推送到vector. 最佳答案 另一种选择是voidpush_back(Tx);即按值取x。但是,这将(在C++03中)导致创建x的额外拷贝(push_back的参数中的拷贝)。通过const引用获取x可以避免这种情况。让我们看一下调用v.push_back(T())的堆栈:v.push_back(T()