std::vector存储对象

看文档有如下描述:

vector - C++ Referencehttp://www.cplusplus.com/reference/vector/vector/

(1) template <class... Args>
  void emplace_back (Args&&... args);

Construct and insert element at the end
Inserts a new element at the end of the vector, right after its current last element. This new element is constructed in place using args as the arguments for its constructor.

This effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.

The element is constructed in-place by calling allocator_traits::construct with args forwarded.

A similar member function exists, push_back, which either copies or moves an existing object into the container.

(2) void push_back (const value_type& val);

Add element at the end
Adds a new element at the end of the vector, after its current last element. The content of val is copied (or moved) to the new element.

This effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.

实际感觉没太大区别,可能emplace_back的allocator_traits::construct没有充分理解和运用,总之存储对象时会创建对象和复制,并且容量增量会根据当前的size不同而不同。

emplace_back:

#include <vector>
#include <iostream>

class Obj {
public:
	Obj(int i) {this->i = i; std::cout << "constructor for " << i << "\n";}
	~Obj() {std::cout << "de-construct for " << i << "\n";}
	Obj(const Obj &obj){if(&obj==this)return; i=obj.i; std::cout << "copy constructor for " << i << std::endl;}
public:
	int i;
};

int main()
{
	std::cout << "--------------------------------\n";
	std::vector<Obj> obj_vec1;
	int i=0;
	for(; i<4; i++) {
		Obj obj(i);
		obj_vec1.emplace_back(obj);
		std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	}
	//std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	std::cout << "-------------------------------\n";
	for(; i<8; i++) {
		Obj obj(i);
		obj_vec1.emplace_back(obj);
		std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	}
	//std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	std::cout << "-------------------------------\n";
	//obj_vec1.reserve(10);
	for(; i<12; i++) {
		Obj obj(i);
		obj_vec1.emplace_back(obj);
		std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	}
	//std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	std::cout << "-------------------------------\n";
	for(auto &v : obj_vec1) {
		std::cout << v.i << " ";
	}
	std::cout << std::endl;

    return 0;
}

--------------------------------
constructor for 0
copy constructor for 0
capacity: 1
de-construct for 0
constructor for 1
copy constructor for 1
copy constructor for 0
de-construct for 0
capacity: 2
de-construct for 1
constructor for 2
copy constructor for 2
copy constructor for 0
copy constructor for 1
de-construct for 0
de-construct for 1
capacity: 4
de-construct for 2
constructor for 3
copy constructor for 3
capacity: 4
de-construct for 3
-------------------------------
constructor for 4
copy constructor for 4
copy constructor for 0
copy constructor for 1
copy constructor for 2
copy constructor for 3
de-construct for 0
de-construct for 1
de-construct for 2
de-construct for 3
capacity: 8
de-construct for 4
constructor for 5
copy constructor for 5
capacity: 8
de-construct for 5
constructor for 6
copy constructor for 6
capacity: 8
de-construct for 6
constructor for 7
copy constructor for 7
capacity: 8
de-construct for 7
-------------------------------
constructor for 8
copy constructor for 8
copy constructor for 0
copy constructor for 1
copy constructor for 2
copy constructor for 3
copy constructor for 4
copy constructor for 5
copy constructor for 6
copy constructor for 7
de-construct for 0
de-construct for 1
de-construct for 2
de-construct for 3
de-construct for 4
de-construct for 5
de-construct for 6
de-construct for 7
capacity: 16
de-construct for 8
constructor for 9
copy constructor for 9
capacity: 16
de-construct for 9
constructor for 10
copy constructor for 10
capacity: 16
de-construct for 10
constructor for 11
copy constructor for 11
capacity: 16
de-construct for 11
-------------------------------
0 1 2 3 4 5 6 7 8 9 10 11
de-construct for 0
de-construct for 1
de-construct for 2
de-construct for 3
de-construct for 4
de-construct for 5
de-construct for 6
de-construct for 7
de-construct for 8
de-construct for 9
de-construct for 10
de-construct for 11

push_back:

#include <vector>
#include <iostream>

class Obj {
public:
	Obj(int i) {this->i = i; std::cout << "constructor for " << i << "\n";}
	~Obj() {std::cout << "de-construct for " << i << "\n";}
	Obj(const Obj &obj){if(&obj==this)return; i=obj.i; std::cout << "copy constructor for " << i << std::endl;}
public:
	int i;
};

int main()
{
	std::cout << "--------------------------------\n";
	std::vector<Obj> obj_vec1;
	int i=0;
	for(; i<4; i++) {
		Obj obj(i);
		obj_vec1.push_back(obj);
		std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	}
	//std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	std::cout << "-------------------------------\n";
	for(; i<8; i++) {
		Obj obj(i);
		obj_vec1.push_back(obj);
		std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	}
	//std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	std::cout << "-------------------------------\n";
	//obj_vec1.reserve(10);
	for(; i<12; i++) {
		Obj obj(i);
		obj_vec1.push_back(obj);
		std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	}
	//std::cout << "capacity: " << obj_vec1.capacity() << std::endl;
	std::cout << "-------------------------------\n";
	for(auto &v : obj_vec1) {
		std::cout << v.i << " ";
	}
	std::cout << std::endl;

    return 0;
}

constructor for 0
copy constructor for 0
capacity: 1
de-construct for 0
constructor for 1
copy constructor for 1
copy constructor for 0
de-construct for 0
capacity: 2
de-construct for 1
constructor for 2
copy constructor for 2
copy constructor for 0
copy constructor for 1
de-construct for 0
de-construct for 1
capacity: 4
de-construct for 2
constructor for 3
copy constructor for 3
capacity: 4
de-construct for 3
-------------------------------
constructor for 4
copy constructor for 4
copy constructor for 0
copy constructor for 1
copy constructor for 2
copy constructor for 3
de-construct for 0
de-construct for 1
de-construct for 2
de-construct for 3
capacity: 8
de-construct for 4
constructor for 5
copy constructor for 5
capacity: 8
de-construct for 5
constructor for 6
copy constructor for 6
capacity: 8
de-construct for 6
constructor for 7
copy constructor for 7
capacity: 8
de-construct for 7
-------------------------------
constructor for 8
copy constructor for 8
copy constructor for 0
copy constructor for 1
copy constructor for 2
copy constructor for 3
copy constructor for 4
copy constructor for 5
copy constructor for 6
copy constructor for 7
de-construct for 0
de-construct for 1
de-construct for 2
de-construct for 3
de-construct for 4
de-construct for 5
de-construct for 6
de-construct for 7
capacity: 16
de-construct for 8
constructor for 9
copy constructor for 9
capacity: 16
de-construct for 9
constructor for 10
copy constructor for 10
capacity: 16
de-construct for 10
constructor for 11
copy constructor for 11
capacity: 16
de-construct for 11
-------------------------------
0 1 2 3 4 5 6 7 8 9 10 11
de-construct for 0
de-construct for 1
de-construct for 2
de-construct for 3
de-construct for 4
de-construct for 5
de-construct for 6
de-construct for 7
de-construct for 8
de-construct for 9
de-construct for 10
de-construct for 11

 可以到这里验证一下: C++ Shellicon-default.png?t=L9C2http://cpp.sh/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::array和std::vector都是C++中的容器,用于存储和管理一系列的元素。它们有一些相似之处,但也有一些不同之处。 1. std::array: std::array是一个固定大小的数组,它在编译时就确定了大小。它的大小是固定的,不能动态改变。std::array的元素在内存中是连续存储的,可以通过索引访问元素。以下是std::array的一些常用操作[^1]: - 创建一个空的std::array对象std::array<T, N> arr; - 获取std::array的大小:arr.size(); - 访问std::array中的元素:arr[i]或arr.at(i); - 清空std::array中的所有元素:arr.fill(value); 2. std::vectorstd::vector是一个动态数组,它的大小可以在运行时动态改变。std::vector的元素在内存中也是连续存储的,可以通过索引访问元素。以下是std::vector的一些常用操作: - 创建一个空的std::vector对象std::vector<T> vec; - 创建一个指定大小的std::vector对象std::vector<T> vec(n); - 在std::vector的末尾添加元素:vec.push_back(value); - 获取std::vector的大小:vec.size(); - 清空std::vector中的所有元素:vec.clear(); - 删除std::vector中的最后一个元素:vec.pop_back(); - 删除std::vector中的指定元素:vec.erase(vec.begin() + i); - 迭代访问std::vector中的元素:for (auto it = vec.begin(); it != vec.end(); ++it) { ... } std::array适用于大小固定且不需要频繁创建销毁的情况,而std::vector适用于大小不确定且需要频繁创建销毁的情况。在性能方面,std::array在大部分情况下与std::vector相比没有明显的差距。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值