1.概念
vector本质是顺序表。它像数组一样,用一块连续的空间对数据进行管理,但又区别于数组,它的空间是根据数据进行动态增容的,并封装了一系列成员变量对数据进行监控,封装成员函数对数据进行操作。
2.区别
vector<char>和string(basic_string<char>)有什么区别呢?
1.string处理的是单向信息,而vector<char>处理的是多向信息。例如存放一个人的身份证号,我们更倾向于用string。
2.string的_str末尾有\0,而vector<char>因为存放的是单个单个的字符,因此没有\0的存储.
3.string因为其处理是单向的信息,因此operator+=有其意义,而vector<char>并没有。
3.vector的构造函数
3.1.默认构造函数(无参数)
vector<int> a;
3.2.填充构造函数(vector(size_t n ,const value_type& val = value_type()))
vector<int> a2(18, 9);//创建18个9
3.3.拷贝构造函数
vector<int> a; // 无参数构造
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
vector<int> a1(a); //拷贝构造
3.4.基于迭代器的范围构造(迭代器范围构造都是左闭右开)
//范围构造;用迭代器构造都是左闭右开!
vector<int> a3(a1.begin(), a1.begin() + 2);//只有 1 2
4.vector的遍历即元素访问
4.1利用operator[]和size
for (int i = 0; i < a.size(); i++)
{
cout << a[i] << " ";
}
cout << endl;
4.2利用迭代器
vector<int>::iterator it = a1.begin();
while (it != a1.end())
{
cout << *it << " ";
++it;
}
cout << endl;
4.3.利用基于迭代器的范围for
for (auto& x : a2)
{
cout << x << " ";
}
cout << endl;
4.4 at函数进行元素访问
vector<int> a(4, 4);
cout << a.at(0);
at函数进行元素访问与operator[]进行访问的区别是at访问失败会抛出异常,而operator[]会直接崩溃. 可以用front和back获取首元素和尾元素.
5.迭代器
与string类似。正向用begin()和end()获取,反向用rbegin()和rend()获取;
6. vector的空间增长问题
上述函数的使用都和string类的相同,值得重新注意的是:resize是改变空间的size,如果变大了会初始化空间,而reserve只是单纯的增长空间容量,并不会初始化空间。
在vs,pj版本的stl下当capacity需要扩容时是按照1.5倍扩容
而在linux的g++下,sgi版本的stl下,当capacity需要扩容的时候是按照2倍扩容。
面试中常常会问按照1.5倍好,还是2倍好?其实选择1.5或者2倍是一种选择,需要考虑到效率和空间利用率两方面的问题:按照2倍扩容,扩容次数少了,效率高了,但是空间利用率可能会低。如果按照1.5倍扩容,扩容次数多了,效率低了,但是可能空间利用率就高了。因此需要看数据量的多少酌情考虑.
7.vector的增删查改
7.1 push_back和pop_back
7.2 find(并不是vector中的,在库函数std的algorithm中)
值得注意的是,因为其有普遍性,因此给他传入的是一个迭代器范围,和要找的变量。如果找到就返回该位置的迭代器,找不到就返回end位置迭代器。(注意:只能找到第一个)
例:删除vector中的指定数据
vector<int> a;
a.push_back(0);
a.push_back(7);
a.push_back(5);
a.push_back(6);
a.push_back(6);
a.push_back(5);
//如果存在我要删除a中的所有5;
auto begin = a.begin();
while (begin != a.end())
{
auto it = find(begin, a.end(), 5);
if (it != a.end())
{
begin = a.erase(it);
}
}
for (auto& x : a)
{
cout << x << " ";
}
7.3erase和insert(都是用迭代器实现)
erase
分别是删除指定迭代器位置的数据,并返回新的下个位置。和范围删除。
insert
在指定的迭代器位置前,插入数据。或者插入n个相同的数据,或者插入一个数据段。
7.4swap
交换两个vector的数据空间,实际上是利用库的swap,分别交换_str,_size,_capacity,然后在类里面保证成函数