标签: vector

容量是否在向量中复制?

请使用以下代码:

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)

是否复制了容量?最后一行会有重新分配吗?标准是否对此有所说明或是否保持沉默?

c++ vector

52
推荐指数
2
解决办法
1678
查看次数

std :: vector*在增加容量时是否有*移动对象?或者,分配器可以"重新分配"吗?

一个不同的问题启发了以下思想:

在增加容量时是否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)

c++ vector realloc allocator

51
推荐指数
2
解决办法
3107
查看次数

矢量矢量来创建矩阵

我正在尝试输入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)

每当我尝试这样做时,它会给我一个超出范围错误的下标.有什么建议?

c++ vector matrix

51
推荐指数
3
解决办法
21万
查看次数

为什么std :: vector比std :: deque更受欢迎?

可能重复:
为什么我更喜欢使用vector来deque

我很好奇为什么它std::vector比这更受欢迎std::deque.Deque几乎和查找一样有效,插入更有效(没有vector :: reserve),允许在前面插入/删除.

Herb Sutter曾经建议如果你想使用矢量,那就更喜欢deque(我在解读).然而,在最近关于编写Modern C++的演讲中,他再次强烈建议将其std::vector视为默认容器.根据我之前链接的GOTW,即使标准也有类似的措辞.

有这种差异的原因吗?它vector是否更简单,更为人所知,还是有技术原因?或者它vector只是一个更酷的名字..?

c++ vector deque

51
推荐指数
5
解决办法
6033
查看次数

将一个std :: vector附加到另一个stnd :: vector的最有效方法是什么?

设v1为目标向量,v2需要附加到后面.

我现在在做:

v1.reserve(v1.size() + v2.size()); 
copy(v2.begin(), v2.end(), back_inserter(v1));
Run Code Online (Sandbox Code Playgroud)

这是最有效的方式吗?或者它可以通过复制一块内存来完成?谢谢!

c++ performance stl vector

50
推荐指数
4
解决办法
5万
查看次数

在同一平面内具有相同原点的两个3D矢量之间的有符号角度

我需要的是位于同一3D平面内且具有相同原点的两个矢量Va和Vb之间的有符号旋转角度,知道:

  1. 包含两个矢量的平面是任意的,并且不与XY或任何其他基本平面平行
  2. Vn - 平面法线
  3. 两个向量与法线具有相同的原点O = {0,0,0}
  4. Va - 是测量Vn左手旋转的参考

应该以这样的方式测量角度,因此如果平面是XY平面,则Va将代表它的X轴单位矢量.

我想我应该通过使用Va作为X轴并将Vb和Vn的叉积作为Y轴来执行一种坐标空间变换,然后使用像atan2()或其他东西一样的2d方法.有任何想法吗?公式?

math 3d geometry vector

50
推荐指数
5
解决办法
6万
查看次数

模板中的模板:为什么"`>>"应该是嵌套模板参数列表中的">>"

我知道当我们在另一个模板中使用模板时,我们应该这样写:

vector<pair<int,int> > s;

如果我们在没有空格的情况下写它:

vector<pair<int,int>> s;

我们会收到一个错误:

嵌套模板参数列表中的`>>'应该是`>>'

我觉得这是可以理解的,但我不禁想知道,在哪种情况下,这真的很模糊?

c++ compiler-construction templates vector lexicographic

50
推荐指数
5
解决办法
3万
查看次数

Arduino中的向量

我在Arduino上制作了"航点"的矢量.每个航点都是一个对象.Arduino显然需要为航点导航存储多个航路点.但是,不是将这些航点存储在标准的预编程阵列中,用户需要能够添加,删除航点并移动它们.不幸的是,Arduino不提供矢量类型作为内置库.

我目前正在考虑两种选择:

  1. 容器中为C++'vector'这样的对象?有人发布了一个通用图书馆.它不包含任何索引删除或移动操作.但它确实包含一些内存管理策略.

  2. 我过去使用过malloc,dealloc,calloc.但我根本不喜欢这个选项,尤其是课程.但这在我的Senario中是一个更好的选择吗?

哪条路走得更好?

c++ vector arduino

50
推荐指数
2
解决办法
6万
查看次数

pop_back()返回值?

为什么没有pop_back()返回值?我用Google搜索了这一点,发现它使它更有效率.这是在标准中做到这一点的唯一原因吗?

c++ vector

50
推荐指数
6
解决办法
3万
查看次数

如何逆序向量?

假设我有一个向量v,我如何得到它的反向,即最后一个元素?

我遇到的第一件事是v[length(v):1],但是当它vnumeric(0),当它返回NA时,用户通常期望排序什么都不返回任何东西,没有排序什么都不会返回不可用的东西 - 它确实在我的情况下产生了很大的不同.

sorting reverse r vector

50
推荐指数
1
解决办法
5万
查看次数