C++矢量push_back()的详细信息
Details of C++ Vector push_back()
我正在尝试调试一个程序,这样做与我对C++向量push_back()函数的理解相悖。
为了说明我的观点,我写了以下短程序:
#include <iostream>
#include <vector>
#include <cstdlib>
using std::cout;
using std::endl;
using std::vector;
class Test {
private:
int mTestMember;
public:
Test(int val);
Test(const Test&);
int GetValue() const;
};
Test::Test(int val)
{
cout << "Constructorn";
mTestMember = val;
}
Test::Test(const Test& test)
{
cout << "Copy Constructorn";
mTestMember = test.mTestMember;
cout << "mTestMember: " << mTestMember << endl;
}
int main(){
vector<Test> tests;
tests.push_back(Test(int(5)));
cout<< endl;
tests.push_back(Test(int(6)));
cout << endl;
tests.push_back(Test(int(7)));
return(0);
}
如果我编译并运行,我会得到以下输出:
Constructor
Copy Constructor
mTestMember: 5
Constructor
Copy Constructor
mTestMember: 6
Copy Constructor
mTestMember: 5
Constructor
Copy Constructor
mTestMember: 7
Copy Constructor
mTestMember: 5
Copy Constructor
mTestMember: 6
看起来,在push_back()函数的过程中,会对作为参数传递给push_back()函数(我已经知道了)的对象进行复制,然后将先前存在的元素中的其余元素也从前面开始复制到新的向量中。
我对这个过程的理解正确吗?
std::vector
将其元素存储在数组中。数组总是有固定的大小,所以如果您不断向std::vector
添加元素,它的底层数组最终会填满。当数组已满并且您添加了另一个元素(通过push_back
或添加新元素的另一个成员函数)时,它必须:
- 创建一个新的、更大的阵列
- 将(*)元素从旧数组复制或移动到新数组
- 将新元素插入到新数组中,然后
- 摧毁旧阵列
此过程称为重新分配。std::vector
的正确实现应该按指数调整数组的大小。Visual C++std::vector
实现使用了1.5倍的增长因子;其他实现方式可以使用不同的增长因子。
(*)C++11增加了对移动对象的支持
相关文章:
- std::extent 实现详细信息说明
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- protobuf,如何在protobuf消息中遍历所有集合字段,我不知道详细信息?(C++)
- AVX2收集指令使用详细信息
- 只知道运行时的数据类型.如何将数据详细信息隐藏到使用它们的其他类
- CppUnit:如何立即打印故障详细信息
- 我可以为 C++ 类提供不完整的标头以隐藏实现详细信息吗?
- CPP 异常获取抛出调用方的详细信息
- 内存映射 IO 概念详细信息
- 如何在文本文件中搜索员工记录(按名称)并仅显示其详细信息?
- 使用TDD时隐藏文件访问实现详细信息
- 急需有关_doserrno(MSVC)的详细信息
- 主 - Embarcadero C++生成器 10.2 中的详细信息数据集
- 如果构造函数从调用到 std::make_shared 崩溃,GDB 是否可以显示崩溃的详细信息
- 实现 std::tuple 的详细信息
- 如何使 clang 格式将所有详细信息命名空间缩进一个
- 如何从 VisualStudio 获取更多详细信息以跟踪警告的来源
- 增加网格详细信息(附加的镶嵌)
- 如何通过 boost::asio 从send_to获取特定的错误详细信息?