一.vector特点
底层原理 : vector底层原理是一个连续的动态数组,使用指针管理内存。vector内部维护了三个指针:指向数组起始位置的指针start、指向数组末尾位置的指针finish和指向数组分配空间末尾位置的指针end_of_storage。增加元素 : 当vector需要增加元素时,会先检查是否有足够的容量,如果没有,就分配一段更大的内存空间,并将原来的元素移动到新的空间中。这个操作称为重新分配内存(re-allocation)。访问元素 : (1).vector支持随机访问,可以通过指针算术运算和下标运算符直接访问元素。由于vector的元素在内存中是连续存储的,因此访问元素的时间复杂度为O(1)。 (2).除了支持快速随机访问外,vector还支持在末尾添加或删除元素的高效操作,时间复杂度为O(1)。 (3).但在中间位置插入或删除元素时,需要移动元素,时间复杂度为O(n)。优势 : (1).内存管理:vector会自动处理内存分配和释放,无需手动管理。 (2).高效访问:可以使用下标或迭代器进行高效的随机访问。 (3).灵活性:vector的大小可以根据需要进行动态调整,不需要预先分配固定大小的空间。注意事项 : (1).对vector的中间位置进行插入或删除操作,会导致vector中的元素需要移动位置,这会影响程序的性能。 (2).在vector的末尾添加元素时,可能会触发vector的重新分配内存,这会导致之前的迭代器和指针失效,需要重新获取。
二.vector常用操作
1.头文件
# include <vector>
# include <algorithm>
int x;
vector< int > b;
while ( cin >> x) {
b. push_back ( x) ;
}
2.vector初始化
(1 )vector< int > a ( 10 ) ;
(2 )vector< int > a ( 10 , 1 ) ;
(3 )vector< int > a ( b) ;
(4 )vector< int > a ( b. begin ( ) , b. begin ( ) + 3 ) ;
(5 )int b[ 7 ] = { 1 , 2 , 3 , 4 , 5 , 9 , 8 } ; vector< int > a ( b, b+ 7 ) ;
3.插入和删除元素
std:: vector< int > v;
v. push_back ( 1 ) ;
v. push_back ( 2 ) ;
v. push_back ( 3 ) ;
v. pop_back ( ) ;
v. insert ( v. begin ( ) + 1 , 4 ) ;
v. erase ( v. begin ( ) + 2 ) ;
4.访问元素
std:: vector< int > v { 1 , 2 , 3 , 4 , 5 } ;
int x = v[ 0 ] ;
int y = v. at ( 1 ) ;
for ( auto it = v. begin ( ) ; it != v. end ( ) ; ++ it) {
std:: cout << * it << " " ;
}
for ( int n : v) {
std:: cout << n << " " ;
}
5.修改元素
std:: vector< int > v { 1 , 2 , 3 } ;
v[ 1 ] = 4 ;
v. at ( 2 ) = 5 ;
6.容量操作
std:: vector< int > v { 1 , 2 , 3 , 4 , 5 } ;
int size = v. size ( ) ;
bool empty = v. empty ( ) ;
int capacity = v. capacity ( ) ;
v. reserve ( 10 ) ;
v. shrink_to_fit ( ) ;
7.数据操作
std:: vector< int > v { 1 , 2 , 3 } ;
int * data = v. data ( ) ;
data[ 1 ] = 4 ;
8.其他操作
std:: vector< int > v { 1 , 2 , 3 } ;
std:: vector< int > v2 { 4 , 5 , 6 } ;
v. swap ( v2) ;
v. clear ( ) ;
v. emplace_back ( 1 ) ;
v. emplace_back ( 2 ) ;
v. emplace ( v. begin ( ) + 1 , 3 ) ;
三.algorithm>库中对vector的常见操作
1.查找和排序操作
find:在vector中查找指定值,并返回迭代器。
find_if:在vector中查找符合指定条件的元素,并返回迭代器。
binary_search:在已排序的vector中查找指定值,返回bool 值表示是否找到。
sort:对vector中的元素进行排序。
stable_sort:对vector中的元素进行稳定排序。
2.替换和修改操作
copy:将vector中的元素复制到另一个容器中。
copy_n:将vector中的指定个数的元素复制到另一个容器中。
copy_if:将vector中符合指定条件的元素复制到另一个容器中。
transform:对vector中的元素应用指定操作,将结果存储到另一个容器中。
replace:将vector中指定值替换为另一个值。
replace_if:将vector中符合指定条件的元素替换为另一个值。
remove:从vector中删除指定值。
remove_if:从vector中删除符合指定条件的元素。
unique:从vector中删除相邻的重复元素,只保留一个。
2.其他操作
min_element:返回vector中的最小元素的迭代器。
max_element:返回vector中的最大元素的迭代器。
accumulate:对vector中的元素进行累加操作。
count:计算vector中指定值的出现次数。
count_if:计算vector中符合指定条件的元素的个数。
四.其他
向量a中添加元素
vector< int > a;
for ( int i = 0 ; i < 10 ; i++ )
a. push_back ( i) ;
从数组中选择元素向向量中添加
int a[ 6 ] = { 1 , 2 , 3 , 4 , 5 , 6 } ;
vector< int > b;
for ( int i = 1 ; i <= 4 ; i++ )
b. push_back ( a[ i] ) ;
从现有向量中选择元素向向量中添加
int a[ 6 ] = { 1 , 2 , 3 , 4 , 5 , 6 } ;
vector< int > b;
vector< int > c ( a, a + 4 ) ;
for ( vector< int > :: iterator it = c. begin ( ) ; it < c. end ( ) ; it++ )
b. push_back ( * it) ;
从文件中读取元素向向量中添加
ifstream in ( "data.txt" ) ;
vector< int > a;
for ( int i; in >> i)
a. push_back ( i) ;
易犯错误
vector< int > a;
for ( int i = 0 ; i < 10 ; i++ )
a[ i] = i;