矢量预分配不能正常工作
Vector preallocation does not work properly
我有一些问题与以下代码:
#include <iostream>
#incldue <vector>
template <typename ElemType>
class A{
private:
std::vector<ElemType> data;
public:
A() {};
A(int capacity) {
data.reserve(capacity);
}
int GetCapacity() {
return data.capacity();
}
};
int main() {
A<int> a;
a = A<int>(5);
std::cout << a.GetCapacity() << std::endl;
}
输出为0。有什么问题吗?
std::vector<T>
的复制构造函数和赋值操作符不需要复制vector的容量,只需要复制元素。因为a = A<int>(5)
行间接调用了赋值操作符(在创建临时容器之后),所以a
中的vector没有容量。
尝试将main的前两行更改为A<int> a(5)
,看看结果如何。
如果您绝对需要将容量从一个实例转移到另一个实例的能力,则需要定义A的赋值和复制构造函数来复制数据和分配容量。
因为您没有实现A
的复制赋值,从而保留了vector的容量。编译器生成的A
的复制赋值确保只复制vector的元素。不需要vector的复制构造函数(和复制赋值)来保留源vector对象的容量。它复制元素,保留vector的size
。
A
的复制赋值定义为:
A& operator = (const A & a)
{
data = a.data;
}
仍然会打印0
。
您想要的行为可以通过实现复制赋值来实现:
A& operator = (const A & a)
{
data.reserve(a.capacity());
data.insert(data.end(), a.begin(), a.end());
}
注意.insert()
只复制元素,因为.size()
改变了,但.capacity
保持不变。这就是为什么需要显式调用.reserve()
。
这是因为你给a赋值,赋值只会复制值和容量。
如果你想构造一个固定的容量,那么
A<int> a(5);
如果你想用赋值来转移容量,你需要自己编写赋值操作符
A& operator=(const A& a)
{
if(&a!=this)
{
data.assign(a.data);
data.reserve(a.capacity);
}
return *this;
}
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程