动态数组,可变数组。
vector容器是一个单口容器。
vector实现动态增长的基本原理:当插入新元素的时候,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间数据拷贝到新空间,释放旧空间的数据,再把新元素插入新申请的空间,默认为两倍增长。
vector是单口容器,所以在尾端插入和删除元素效率较高, 在指定位置插入,势必会引起数据元素移动, 效率较低.
vector常用操作#include<iostream>
#include<vector>
void printV(std::vector<int>& v)
{
for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
std::cout << *it << " ";
}
std::cout << std::endl;
}
//初始化操作
void test()
{
std::vector<int> v1; //默认构造
int arr[] = {10, 20, 30, 40, 50};
std::vector<int> v2(arr, arr + sizeof(arr)/sizeof(int));
std::vector<int> v3(v2.begin(), v2.end());
std::vector<int> v4(v3);
print(v2);
print(v3);
print(v4);
}
//赋值操作
void test2()
{
int arr[] = {10, 20, 30, 40};
std::vector<int> v1(arr, arr+sizeof(arr)/sizeof(int));//默认构造
std::vector<int> v2;
v2.assign(v1.begin(), v1.end()); //成员方法
std::vector<int> v3;
v3 = v2;// 重载
int arr1[] = {100, 200, 300, 400};
std::vector<int> v4(arr1, arr1+sizeof(arr)/sizeof(int));
print(v1);
print(v2);
print(v3);
print(v4);
std::cout << "-------------------" << std::endl;
v4.swap(v1);
print(v1);
print(v2);
print(v3);
print(v4)
}
//大小操作
void test3()
{
int arr1[] = {100, 200, 300, 400};
std::vector<int> v4(arr1, arr1 + sizeof(arr1)/sizeof(int));//默认构造
std::cout << "size: " << v4.size() << std::endl;
if (v4.empty())
{
std::cout << "空" << std::endl;
}
else
{
std::cout << "不空" << std::endl;
}
printV(v4);
v4.resize(2);
printV(v4);
v4.resize(6, 1);
printV(v4);
for (int i = 0 i < 10000; i++)
{
v4.push_back(i);
}
std::cout << "size: " << v4.size() << std::endl; //元素的个数
std::cout << "容量: " << v4.capacity() << std::endl; //容量
}
//存取数据
void test4()
{
int arr1[] = {100, 200, 300, 400};
std::vector<int> v4(arr1, arr1 + sizeof(arr1)/sizeof(int));//默认构造
for (int i = 0; i < v4.size(); i++)
{
std::cout << v4[i] << " ";
}
std::cout << std::endl;
for (int i = 0; i < v4.size(); i++)
{
std::cout << v4.at(i) << " ";
}
std::cout << std::endl;
//区别: at抛异常, []不抛异常
std::cout << "front: " << v4.front() << std::endl;
std::cout << "back: " << v4.back() << std::endl;
}
//插入和删除
void test5()
{
std::vector<int> v;
v.push_back(10);
v.push_back(20);
//头插法
v.insert(v.begin(), 30);
v.insert(v.end(), 40);
v.insert(v.begin() + 2, 100);//vector支持随机访问
printV(v);
//支持数组下标的,一般都支持随机访问
//迭代器可以直接+2, +3, -2, -5这些操作
//删除
v.erase(v.begin());
printV(v);
v.erase(v.begin() + 1, v.end());
printV(v);
v.clear();
std::cout << "size: " << v.size() << std::endl;
}
//巧用swap缩减空间
void test6()
{
//vector添加元素 它会自动增长,删除元素的时候不会自动减少
std::vector<int> v;
for (int i = 0; i < 100000; i++)
{
v.push_back()
}
std::cout << "size: " << v.size() << std::endl;
std::cout << "capacity: " << v.capacity() << std::endl;
v.resize(10);
std::cout << "--------------------------" << std::endl;
std::cout << "size: " << v.size() << std::endl;
std::cout << "capacity: " << v.capacity() << std::endl;
//收缩空间
std::vector<int>(v).swap(v);
std::cout << "--------------------------" << std::endl;
std::cout << "size: " << v.size() << std::endl;
std::cout << "capacity: " << v.capacity() << std::endl;
}
//reserve和resize区别
void test7()
{
//reserve是容器预留空间,但在空间不真正创建元素对象,所以在没有新的对象之前,不能引用容器内的元素
//resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了
int num = 0;
int* address = NULL;
std::vector<int> v;
v.reserve(100000);
for (int i = 0; i < 100000; i++)
{
v.push_back(i);
if (address != &(v[0]))
{
address = &(v[0]);
num++;
}
}
std::cout << "num: " << num << std::endl;
}
int main(void)
{
//test();
//test2();
//test3();
//test4();
//test5();
//test6();
test7();
return 0;
}
申明:本文章记录学习笔记,分享给大家一起学习,有不正确的地方欢迎大家指出。如有侵权,马上删除。
最新评论