vector容器介绍
- 和数组相似,称为单端数组
- 数组是静态空间,但是vector可以动态扩展
并不是在原空间后面扩新空间,而是拷贝原数据到找更大的新内存空间,释放原空间
工作原理
Note
vector图解
⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠
Text Elements
1
2
4
3
begin()
insert()
end()
push_back()
pop_back()
back()
指向原始笔记的链接
vector构造函数
vector<T>v;//默认构造vector(v.begin(), v.end());//迭代器构造vector(n, elem);//重复元素构造vector(const vector& vec);//拷贝构造
#include <vector>
#include <iostream>
using namespace std;
void print(vector<int>& v)
{
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
vector<int>v1;
for(int i = 0; i < 10; i++)
{
v1.push_back(i);
}
print(v1);
vector<int>v2(v1.begin(), v1.end());
print(v2);
vector<int>v3(10, 100);
print(v3);
vector<int>v4(v3);
print(v4);
return 0;
}
/*output:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100 100 100 100 100 100
100 100 100 100 100 100 100 100 100 100
*/vector赋值
vector& operator=(const vector& vec);//拷贝赋值assign(beg, end);//拷贝赋值assign(n, elem);//重复元素赋值
#include <vector>
#include <iostream>
using namespace std;
void print(vector<int>& v)
{
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
vector<int>v1;
for(int i = 0; i < 10; i++)
{
v1.push_back(i);
}
print(v1);
vector<int>v2;
v2 = v1;
print(v2);
vector<int>v3;
v3.assign(v1.begin(), v1.end());
print(v3);
vector<int>v4;
v3.assign(10, 100);
print(v4);
return 0;
}
/*output:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
100 100 100 100 100 100 100 100 100 100
*/vector容量大小
empty();是否为空capacity();容量size();元素量resize(int num);重新指定大小,如果是扩容,多余的元素用默认值填充,如果是变短,则删除多余元素resize(int num, elem);如果是扩容,多余的元素用elem填充,如果是变短,则删除多余元素
#include <vector>
#include <iostream>
using namespace std;
void print(vector<int>& v)
{
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
vector<int>v1;
for(int i = 0; i < 10; i++)
{
v1.push_back(i);
}
print(v1);
if(v1.empty())
{
cout << "空" << endl;
}
else
{
cout << "非空" << endl;
cout << v1.capacity() << " " << v1.size() << endl;
}
v1.resize(15);
print(v1);
v1.resize(5);
print(v1);
v1.resize(10, 10);
print(v1);
return 0;
}
/*output:
0 1 2 3 4 5 6 7 8 9
非空
13 10
0 1 2 3 4 5 6 7 8 9 0 0 0 0 0
0 1 2 3 4
0 1 2 3 4 5 10 10 10 10 10
*/vector插入删除
push_back(ele);//尾部插入元素,自动开辟空间pop_back();//删除最后的元素insert(const_iterator pos, ele);//ele从pos位置插入(从0开始数)insert(const_iterator pos, int count, ele);//ele从pos位置插入count次(从0开始数)erase(const_iterator pos);//删除pos位元素(从0开始数)erase(const_iterator start, const_iterator end);//删除pos位元素[beg, end)clear();//全清
#include <vector>
#include <iostream>
using namespace std;
void print(vector<int>& v)
{
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
vector<int>v1;
for(int i = 0; i < 10; i++)
{
v1.push_back(i);
}
print(v1);
v1.pop_back();
print(v1);
v1.insert(v1.begin(), 100);
print(v1);
v1.insert(v1.begin(), 2, 200);
print(v1);
v1.erase(v1.begin());
print(v1);
v1.erase(v1.begin(), v1.end()); //v1.clear();
print(v1);
return 0;
}
/*output:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8
100 0 1 2 3 4 5 6 7 8
200 200 100 0 1 2 3 4 5 6 7 8
200 100 0 1 2 3 4 5 6 7 8
*/vector数据存取
at(int idx);operator[];front();//获取首位元素back();//获取末位元素
#include <vector>
#include <iostream>
using namespace std;
void print(vector<int>& v)
{
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
vector<int>v1;
for(int i = 0; i < 10; i++)
{
v1.push_back(i);
}
print(v1);
for(int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
for(int i = 0; i < v1.size(); i++)
{
cout << v1.at(i) << " ";
}
cout << endl;
cout << v1.front() << endl;
cout << v1.back() << endl;
return 0;
}
/*output:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0
9
*/vector互换容器
swap(vec);//将vec与本身元素呼唤emplace_back();//
#include <vector>
#include <iostream>
using namespace std;
void print(vector<int>& v)
{
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
vector<int>v1;
vector<int>v2;
for(int i = 0; i < 10; i++)
{
v1.push_back(i);
}
print(v1);
for(int i = 10; i > 0; i++)
{
v2.push_back(i);
}
print(v2);
v1.swap(v2);
print(v1);
print(v2);
return 0;
}
/*output:
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
*/title:Important
collapse:open
巧妙利用swap可以收缩内存空间
`vector<int>(v).swap(v);`
- `vector<int>(v)` 匿名对象
- `.swap(v);` 与现存的v交换void test()
{
vector<int>v;
for(int i = 0; i < 100000; i++)
{
v.push_back(i);
}
cout << v.capacity() << endl;
cout << v.size() << endl;
v.resize(3);
cout << v.capacity() << endl;
cout << size() << endl;
vector<int>(v).swap(v);
cout << v.capacity() << endl;
cout << size() << endl;
}
/*output:
130855
100000
130855
3
3
3
*/vector预留空间
reserve(int len);//预留len长度,预留位置不初始化,元素不可访问
title:Example
collapse:open
如果一次性赋值非常多数据,直接赋值会导致vector频繁开辟空间,如果直接一次预留大量空间,会节省vector开辟空间的开销#include <vector>
#include <iostream>
using namespace std;
void print(vector<int>& v)
{
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
vector<int>v1;
int num = 0;
int *p = nullptr;
for(int i = 0; i < 100000; i++)
{
v1.push_back(i);
if(p != &v1[0])
{
p = &v1[0];
num++;
}
}
cout << num << endl;
vector<int>v2;
v2.reserve(100000);
int num2 = 0;
int *p2 = nullptr;
for(int i = 0; i < 100000; i++)
{
v1.push_back(i);
if(p2 != &v2[0])
{
p2 = &v2[0];
num2++;
}
}
cout << num2 << endl;
return 0;
}
/*output:
30
1
*/下一节: string