1、vector容器
1.1性质
a)该容器的数据结构和数组相似,被称为单端数组。
b)在存储数据时不是在原有空间上往后拓展,而是找到一个新的空间,将原数据深拷贝到新空间,释放原空间。该过程被称为动态拓展。
vector迭代器支持随机访问。
1.2 构造函数
std::vector<int> vec1{};//无参构造
std::vector<int> vec2(3, 4);//初始化3个元素4到int型vector中
std::vector<int> vec3(vec2.begin(), vec2.end());//迭代器初始化
std::vector<int> vec4(vec3);//拷贝构造
注意:拷贝构造函数中为深拷贝。
1.3 赋值操作
std::vector<float> vec1 = temp_vec;//operator=,深拷贝形式
std::vector<float> vec2;
vec2.assign(3, 8); // n个elem赋值
vec2.assign(vec1.begin(), vec1.end());//区间赋值,这里是区间是迭代器
1.4 vector容量和大小
void Print_vec(std::vector<float>& vec) {
for (auto i : vec) {
cout << i << " ";
}
cout << endl;
}
int main() {
//初始化vector
std::vector<float> vec(5, 8);
std::cout << vec.empty() << std::endl; ;//判断是否为空
std::cout << vec.size() << std::endl; //输出vector容器中元素数量
std::cout << vec.capacity() << std::endl; //输出vector容器中容量
vec.resize(10); //重新指定vec的元素数量,多余的默认0填充
vec.resize(15, 3);//重新指定vec的元素数量的重载,可以指定填充值
Print_vec(vec);
system("pause");
return 0;
}
1.5 vector插入删除
1.6vector数据存取
1.7 vector互换容器swap
目的:实现两个容器内容互换。
实际用途:实现容器容量的收缩,减少内存浪费。
(说明:当一个大容量的vector只有少量元素时,只使用resize重新指定其元素数量并不会改变其容量大小,而使用一个小容量的vector与其进行内容互换的实质是将两个容器的地址互换,此时使用的小容量vector是匿名类型,系统会自动把多余的容量内存释放。)
目的示例:
void Print_vec(std::vector<float>& vec) {
for (auto i : vec) {
cout << i << " ";
}
cout << endl;
}
int main() {
//初始化vector
std::vector<float> vec1(5, 8);
std::vector<float> vec2(9, 4);
Print_vec(vec1);
Print_vec(vec2);
vec1.swap(vec2);
Print_vec(vec1);
Print_vec(vec2);
system("pause");
return 0;
}
实际用途示例:
std::vector<float> vec1(10000, 8);
std::vector<float> vec2(9, 4);
std::cout << vec1.capacity() << std::endl;
std::cout << vec1.size() << std::endl;
vec1.swap(vec2);
std::cout << vec1.capacity() << std::endl;
std::cout << vec1.size() << std::endl;
1.8 vector预留空间
目的:减少vector在动态拓展时的拓展次数,即减少从原空间拷贝到新空间的次数。
接口:vec.reserve(r_size)
int main() {
//初始化vector
//统计开辟空间次数,利用指针指向vec的首地址,当指针地址改变则说明开辟了一次空间
int* p = NULL;
int num = 0;
std::vector<int> vec;
vec.reserve(10000);
for (int i = 0; i < 10000; ++i) {
vec.push_back(i);
if (p != &vec[0]) {
p = &vec[0];
num++;
}
}
std::cout << num << std::endl;
system("pause");
return 0;
}
预留空间与不预留空间的动态拓展次数对比: