1 vector介绍
vector是表示可变大小数组的容器。
vector比较像数组,采用连续存储空间来存储元素。可以采用下标对vector元素进行访问,和数组一样。但是,不一样在于,vector的大小是可以动态改变的,而且vector的大小会被容器自动处理。
2 vector常见接口
2.1 构造函数
代码参考:
vector<int> v1; //空vector
vector<int> v2(10, 2); //10个空间,存2
vector<int>v3(v2.begin(), v2.end());
vector<int> copy(v1); //拷贝构造
2.2 vector iterator
vector维护的是一个连续线性空间,所以不论其元素型别为何,普通指针都可以作为vector的迭代器而满足所有必要条件,因为vector迭代器所需要的操作operator* 等操作普通指针天生就有。
下图表示常用的迭代器:
这里用迭代器实现遍历:(实现功能:正向迭代器,迭代器修改值,反向迭代器)。
void TestVector()
{
vector<int> v1; //空vector
vector<int> v2(10, 2); //10个空间,存2
vector<int> copy(v1); //拷贝构造
vector<int>v3(v2.begin(), v2.end());
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
//vector遍历方式 迭代器
vector<int>::iterator it1 = v1.begin();
while (it1 != v1.end())
{
cout << *it1 << " ";
++it1;
}
cout << endl;
// 迭代器中 值的修改
it1 = v1.begin();
while (it1 != v1.end())
{
*it1 *= 2;
cout << *it1 << " ";
++it1;
}
cout << endl;
//反向迭代器
vector<int>::reverse_iterator rit = v1.rbegin();
while (rit != v1.rend())
{
cout << *rit << " ";
++rit;
}
cout << endl;
}
2.3 容量空间
size、empty、capacity:
重点分析:capacity的增容问题?
在vs中运行时,增容方式:
看图可知在vs中的增容方式为1.5倍增容。
在linux环境下,g++运行结果为:
分析可知,在g++环境下capacity扩容方式为2倍扩容。
reserve:
改变vector放入capacity。
如果n大于当前vector容量,该函数将使容器重新分配其存储,并将其容量增加到n(或更大)。在所有其他情况下,函数调用不会导致重新分配,vector容量也不会受到影响。此函数对vector大小没有影响,并且不能更改其元素。
resize:
调整容器大小,使其包含n个元素。
- 如果n小于当前容器大小,则内容将减少到其前n个元素,并删除超出的元素(并销毁它们)。
- 如果n大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到n的大小。如果指定了val,则新元素将初始化为val的副本,否则,它们将被值初始化。
- 如果n也大于当前容器容量,则会自动重新分配分配的存储空间。请注意,此函数通过插入或删除容器中的元素来更改容器的实际内容。
shrink_to_fit:
请求容器减小其容量以适应其大小。这可能会导致重新分配,但对vector的size没有影响,并且不能改变其元素。
2.4 元素获取
分析:
front、back:返回对vector中第一个元素的引用,该函数返回直接引用;
data 操作时返回一个直接指针,指向内部用于存储其所属元素的内存数组。后面++p,p[2]等操作都是以指针为基础的操作。
测试代码:
//验证 元素获取
void TestElement()
{
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v2.push_back(i);
}
for (int i = 0; i < v2.size(); ++i)
{
cout << v2[i]<<" ";
}
cout << endl;
for (int i = 0; i < v2.size(); ++i)
{
cout << " " << v2.at(i);
}
cout << endl;
vector<int> v3;
v3.push_back(9);
v3.push_back(20);
v3.front() += v3.back();
cout << v3.front() << endl;
vector<int> v4(5);
int *p = v4.data();
*p = 10;
++p;
*p = 20;
p[1] = 30;
for (int i = 0; i < v4.size(); ++i)
{
cout << v4[i] << " ";
}
cout << endl;
}
运行结果:
2.5 修改(增删查改)
下面是vector中的元素修改模块,其含义在下面给出:
- push_back :尾插
- pop_back:尾删
- insert:在pos位置之前插入val值
- erase:删除pos位置数据
- swap:交换两个vector的数据空间
代码测试:
insert测试代码:
insert插入有三种方式,下面代码给出详细解释。
//insert
/*
single element (1)
iterator insert (iterator position, const value_type& val);
fill (2)
void insert (iterator position, size_type n, const value_type& val);
range (3)
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);
*/
void TestInsert()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);
//头插 0
v.insert(v.begin(), 0);
PrintVector(v);
v.erase(v.begin());
PrintVector(v);
std::vector<int> v1{ 1,2,3,4,5,6 };
std::vector<int>::iterator pos1 = find (v1.begin(), v1.end(), 3);
if (pos1 != v1.end())
{
v1.insert(pos1, 30);
}
PrintVector(v1);
std::vector<int>::iterator pos2 = find(v1.begin(), v1.end(), 5);
if (pos2 != v1.end())
{
v1.insert(pos2, 3, 30);
}
PrintVector(v1);
vector<int> v2(3, 6);
v1.insert(v1.begin() + 1, v2.begin(), v2.end());
PrintVector(v1);
}
测试结果:
增删查改测试:
//测试修改 增删查改
void TestModifiers()
{
cout << "=========== assgin 测试============" << endl;
std::vector<int> first;
std::vector<int> second;
std::vector<int> third;
first.assign(7, 100); // 7 ints with a value of 100
PrintVector(first);
std::vector<int>::iterator it;
it = first.begin() + 1;
second.assign(it, first.end() - 1); // the 5 central values of first
PrintVector(second);
int myints[] = { 17, 7, 4 };
third.assign(myints, myints + 3); // assigning from array.
PrintVector(third);
cout << "=========== push_back 测试============" << endl;
vector<int> v1;
for (int i = 0; i < 10; ++i)
{
v1.push_back(i);
}
PrintVector(v1);
cout << "=========== pop_back 测试============" << endl;
if (!v1.empty())
{
v1.pop_back();
}
PrintVector(v1);
cout << "=========== erase 测试============" << endl;
/*
iterator erase (iterator position);
iterator erase (iterator first, iterator last);
*/
v1.erase(v1.begin() + 2);
PrintVector(v1);
v1.erase(v1.begin(), v1.begin() + 2);
PrintVector(v1);
cout << "=========== empty 测试============" << endl;
v1.clear();
if (v1.empty() == 1)
{
cout << "v1 空" << endl;
}
cout << "=========== swap 测试============" << endl;
vector<int> foo(3, 100); // three ints with a value of 100
vector<int> bar(5, 200); // five ints with a value of 200
PrintVector(foo);
PrintVector(bar);
foo.swap(bar);
PrintVector(foo);
PrintVector(bar);
cout << "=========== emplace 测试============" << endl;
vector<int> v3 = { 1, 2, 3, 4, 5 };
auto it1 = v3.emplace(v3.begin() + 2, 100);
v3.emplace(it1, 200);
v3.emplace(v3.end(), 300);
PrintVector(v3);
}
测试结果: