以下结论都是基于Debian 4.19.132-1 (2020-07-24) x86_64 GNU/Linux,g++ (Debian 8.3.0-6) 8.3.0得出

1、要使用vector来做二维数组的时候,经常会这么写:

vector<vector<int>> dp(3,vector<int>(4));

那么问题来了,这句话一共调用了几次构造函数,申请了几次内存?

调用了5次构造函数

第一次是调用临时变量 vector<int>(4) 的构造函数,申请了sizeof(int)*4的内存

第二次是调用dp的构造函数,申请了sizeof(vector<int>)*3的内存

第三次到第五次都是调用dp[0],dp[1],dp[2]的拷贝构造函数,分别申请了sizeof(int)*4的内存

2、vector内存增长的规律:

      _M_check_len(size_type __n, const char* __s) const
      {
	if (max_size() - size() < __n)
	  __throw_length_error(__N(__s));

	const size_type __len = size() + std::max(size(), __n);
	return (__len < size() || __len > max_size()) ? max_size() : __len;
      }

因此基本上就是newsize = size + max(size,n),n就是你新插入的长度。当每次只插入一个元素的时候,那么vector的capacity就会以2的指数增长。

3、vector在扩容的时候,是用malloc还是realloc?

根据我的平台环境来看,是用malloc申请个更大的地址

4、vector扩容以后,怎样重新构造对象?

如果有noexcept 的移动构造函数,那就用移动构造,没有的话,就用拷贝构造函数。所以你光写了移动构造函数还不行,一定要noexcept!!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注