请使用以下代码:
std::vector<int> a;
a.reserve(65536);
std::vector<int> b(a); //NOTE: b is constructed from a
a.reserve(65536); // no reallocation
b.reserve(65536);
Run Code Online (Sandbox Code Playgroud)
是否复制了容量?最后一行会有重新分配吗?标准是否对此有所说明或是否保持沉默?
一个不同的问题启发了以下思想:
在增加容量时是否std::vector<T> 必须移动所有元素?
据我所知,标准行为是底层分配器请求新大小的整个块,然后移动所有旧元素,然后销毁旧元素,然后解除分配旧内存.
在给定标准分配器接口的情况下,此行为似乎是唯一可能的正确解决方案.但我想知道,修改分配器以提供一个reallocate(std::size_t)可以返回a pair<pointer, bool>并可以映射到底层的函数是否有意义realloc()?这样做的好处是,如果操作系统实际上只能扩展分配的内存,那么根本不需要进行任何移动.布尔值表示内存是否已移动.
(std::realloc()也许不是最好的选择,因为如果我们不能扩展,我们不需要复制数据.所以实际上我们更想要类似的东西extend_or_malloc_new().编辑:也许is_pod基于特征的专业化将允许我们使用实际的realloc,包括它的按位副本.只是不一般.)
这似乎错过了机会.最坏的情况下,可以始终贯彻reallocate(size_t n)的return make_pair(allocate(n), true);,所以不会有任何惩罚.
是否有任何问题导致此功能对C++不合适或不合适?
也许唯一可以利用这个的容器就是std::vector,但那时又是一个相当有用的容器.
更新:澄清一个小例子.目前resize():
pointer p = alloc.allocate(new_size);
for (size_t i = 0; i != old_size; ++i)
{
alloc.construct(p + i, T(std::move(buf[i])))
alloc.destroy(buf[i]);
}
for (size_t i = old_size; i < new_size; ++i)
{
alloc.construct(p + i, T());
}
alloc.deallocate(buf); …Run Code Online (Sandbox Code Playgroud) 我正在尝试输入2D矩阵的尺寸.然后使用用户输入填写此矩阵.我尝试这样做的方法是通过矢量(矢量矢量).但是每当我尝试读入数据并将其附加到矩阵时,我就遇到了一些错误.
//cin>>CC; cin>>RR; already done
vector<vector<int> > matrix;
for(int i = 0; i<RR; i++)
{
for(int j = 0; j<CC; j++)
{
cout<<"Enter the number for Matrix 1";
cin>>matrix[i][j];
}
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试这样做时,它会给我一个超出范围错误的下标.有什么建议?
可能重复:
为什么我更喜欢使用vector来deque
我很好奇为什么它std::vector比这更受欢迎std::deque.Deque几乎和查找一样有效,插入更有效(没有vector :: reserve),允许在前面插入/删除.
Herb Sutter曾经建议如果你想使用矢量,那就更喜欢deque(我在解读).然而,在最近关于编写Modern C++的演讲中,他再次强烈建议将其std::vector视为默认容器.根据我之前链接的GOTW,即使标准也有类似的措辞.
有这种差异的原因吗?它vector是否更简单,更为人所知,还是有技术原因?或者它vector只是一个更酷的名字..?
设v1为目标向量,v2需要附加到后面.
我现在在做:
v1.reserve(v1.size() + v2.size());
copy(v2.begin(), v2.end(), back_inserter(v1));
Run Code Online (Sandbox Code Playgroud)
这是最有效的方式吗?或者它可以通过复制一块内存来完成?谢谢!
我需要的是位于同一3D平面内且具有相同原点的两个矢量Va和Vb之间的有符号旋转角度,知道:
应该以这样的方式测量角度,因此如果平面是XY平面,则Va将代表它的X轴单位矢量.
我想我应该通过使用Va作为X轴并将Vb和Vn的叉积作为Y轴来执行一种坐标空间变换,然后使用像atan2()或其他东西一样的2d方法.有任何想法吗?公式?
我知道当我们在另一个模板中使用模板时,我们应该这样写:
vector<pair<int,int> > s;
如果我们在没有空格的情况下写它:
vector<pair<int,int>> s;
我们会收到一个错误:
嵌套模板参数列表中的`>>'应该是`>>'
我觉得这是可以理解的,但我不禁想知道,在哪种情况下,这真的很模糊?
我在Arduino上制作了"航点"的矢量.每个航点都是一个对象.Arduino显然需要为航点导航存储多个航路点.但是,不是将这些航点存储在标准的预编程阵列中,用户需要能够添加,删除航点并移动它们.不幸的是,Arduino不提供矢量类型作为内置库.
我目前正在考虑两种选择:
在容器中为C++'vector'这样的对象?有人发布了一个通用图书馆.它不包含任何索引删除或移动操作.但它确实包含一些内存管理策略.
我过去使用过malloc,dealloc,calloc.但我根本不喜欢这个选项,尤其是课程.但这在我的Senario中是一个更好的选择吗?
哪条路走得更好?
为什么没有pop_back()返回值?我用Google搜索了这一点,发现它使它更有效率.这是在标准中做到这一点的唯一原因吗?
假设我有一个向量v,我如何得到它的反向,即最后一个元素?
我遇到的第一件事是v[length(v):1],但是当它v是numeric(0),当它返回NA时,用户通常期望排序什么都不返回任何东西,没有排序什么都不会返回不可用的东西 - 它确实在我的情况下产生了很大的不同.