【C++】STL 容器 - vector 动态数组容器 ② ( vector 有参构造函数 | 范围构造函数 | 初始化 n 个 指定元素 | 拷贝构造函数 )

2023-12-19 10:07:40 浏览数 (1)

文章目录
  • 一、vector 有参构造函数
    • 1、使用另外的 vector 对象初始化 - 范围构造函数
    • 2、vector 容器初始化 n 个 指定元素
    • 3、vector 容器拷贝构造函数
    • 4、代码示例 - vector 容器有参构造函数

一、vector 有参构造函数


1、使用另外的 vector 对象初始化 - 范围构造函数

vector 动态数组容器 , 初始化时 , 可以使用另外的 vector 对象初始化 ;

下面的 vector 有参构造函数 , 会复制 begin 和 end 之间的元素到 新创建 的 vector 容器中 ;

代码语言:javascript复制
template <class InputIterator>  
vector (InputIterator begin, InputIterator end);
  • InputIterator 参数类型说明 : 该类型一个迭代器类型 , 用于指定要复制的 vector 容器的 元素范围 ;
  • begin 参数 : 指向 要复制的 其它 vector 容器 元素范围的起始位置 的迭代器 ;
  • end 参数 : 指向要复制的 其它 vector 容器 元素范围的 结束位置 的迭代器 ;

特别注意 : 该构造函数并不会检查 begin 和 end 是否有效 , 在使用之前务必验证 迭代器 的范围是否合法 , 如果出现越界会导致异常 ;

代码示例 : 在下面的代码中 先初始化 vec1 容器 , 其中有 3 个元素 {1, 2, 3} , 然后调用 范围构造函数 , 将 vec1 容器指定范围 的 元素 拷贝到 vec2 容器中 , 用于为 vec2 容器初始化 ;

代码语言:javascript复制
// 初始化一个 vector 容器
vector<int> vec1 {1, 2, 3};  

// 使用 范围构造函数 从 vec1 容器中 复制元素到 vec2 容器
vector<int> vec2(vec1.begin(), vec1.end());

2、vector 容器初始化 n 个 指定元素

初始化一个包含 n 个 指定元素的 vector 容器 , 构造函数原型如下 :

代码语言:javascript复制
template <class T, class Allocator = std::allocator<T>>  
class vector {  
public:  
    // 构造函数  
    explicit vector(size_type n, 
    	const value_type& value = value_type(), 
    	const allocator_type& a = allocator_type());  
};

参数说明 :

  • size_type n 参数 : 元素个数 , 将下面的 value 参数值 复制 n 次 , 无符号整数类型 , 表示 vector 的大小 ;
  • const value_type& value 参数 : 要复制的元素值 ; 常量引用 , 表示每个元素的值 , 默认 类型为 T , 即 vector 中元素的类型 ;
  • const allocator_type& a 参数 : 为 元素 分配内存的 内存分配器 , 默认 使用标准分配器 std::allocator<T> ;

该构造函数 与 使用两个迭代器范围进行初始化的构造函数略有不同 ;

  • 使用两个迭代器范围进行初始化时 , 会复制指定范围内的所有元素到新创建的 vector 中 ;
  • 本构造函数 使用 n 和 元素值 进行初始化时 , 会复制指定数量的相同元素到新创建的 vector 中 ;

代码示例 : 下面的代码中 , 创建一个 vector 动态数组容器 , 该容器中 有 5 个元素 , 每个元素值为 int 类型值 6 ;

代码语言:javascript复制
// 创建一个 vector 动态数组容器 
// 该容器中 有 5 个元素 , 每个元素值为 int 类型值 6
std::vector<int> vec(5, 6); 

// 创建一个 vector 动态数组容器 
// 该容器中 有 3 个元素 , 每个元素值为 字符 `A`
std::vector<int> vec(3, 'A'); 

3、vector 容器拷贝构造函数

vector 容器拷贝构造函数 用于创建一个新的 vector 容器对象 , 并将其初始化为另一个已存在的 vector 对象的副本 ;

vector 容器拷贝构造函数原型如下 : 执行拷贝构造时 , 首先 分配足够的内存 来存储复制的元素 , 然后使用分配器 复制所有元素 ;

代码语言:javascript复制
template <class T, class Allocator = std::allocator<T>>  
class vector {  
public:  
    // 拷贝构造函数  
    vector(const vector& other);  
};

确保 拷贝构造函数 中 , 所有的元素是可拷贝的 , 默认是浅拷贝 ;

代码示例 :

代码语言:javascript复制
// 创建 vector 容器 1 , 并初始化
std::vector<int> vec1 {1, 2, 3};  

// 使用 拷贝构造函数 创建 vec2 容器 
// 将其初始化为 vec1 的副本
std::vector<int> vec2(vec1);

4、代码示例 - vector 容器有参构造函数

代码示例 :

代码语言:javascript复制
#include "iostream"
using namespace std;
#include "vector"

// 自定义类
class Student{};

int main() {

	// 创建一个 vector 动态数组容器 
	// 该容器中 有 3 个元素 , 每个元素值为 int 类型值 1
	vector<int> vec1(3, 1);

	// 使用 范围构造函数 从 vec1 容器中 复制元素到 vec2 容器
	vector<int> vec2(vec1.begin(), vec1.end());

	// 使用 拷贝构造函数 创建 vec3 容器 
	// 将其初始化为 vec1 的副本
	vector<int> vec3(vec1);

	
	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
};

执行结果 :

0 人点赞