STL容器(vector)

总结

1)vector我们可以理解为 就是一个变成数组。

2)知道怎么定义 typename 可以很多类型

vector<typename> name;

 3)访问,两种方式,一个给数组一样用下标,一种用迭代器

4)vi.begin(),vi.end() 还有 6个函数的用法

  1. push_back()
  2. pop_back()
  3. size()
  4. clear()
  5. insert()
  6. erase()

1,vector

vector  是干嘛的?

我们可以理解vector 为一个变长数组,也就是说他是个数组,但是长度可长可短。

使用vector 需要+ 上头文件 #include<vector>和 “using namespace std;”

1)定义一个vector

vector<typename> name;

上面定义实际相当于一个一维数组 name【SIZE】,只不过其长度可以根据需要进行变化。比较节省空间,通俗的理解就是 “变长数组

和一维数组一样,这里的typename 可以是人和基本类型,如Int, double, char, 等,也可以是 STL标准容器,如 vector, set, queue,等,如果typename也是一个STL容器,定义的时候要记得 在 >> 符号间+上空格。

vector<int> name;
vector<double> name;
vector<char> name;
vector<node> name;    //node是结构体

这都好理解一看就会

然后我们看一下typename 是vector

vector<vector<int> > name 	// >>之间要+空格  

这种定义不就很好理解了么,2维的变长数组,每一个纬度都是长度可变的。

然后看下vector定义数组的方法

vector<typename> Arrayname[arraySize]; 

例如

vector<int> vi[100]

这个vi是个二维数组,Arrayname[0] ~~ Arrayname[arraySize - 1]中每一个元素都是一个vector容器

与vector<vector<int> > name 不同的是,这种写法的一维长度已经固定为arraySize,另一维才是“变长”的。

2)vector 容器内的访问

1)通过下标

和普通数组一样,对一个定义为vector<typename> vi 的容器来书,直接可以 vi[index]方位元素,下标取值和数组一样是 0 ~ vi.size() - 1.访问超出这个范围,可能会出错(越界访问)。

2)通过迭代器访问

 迭代器(iterator)可以理解为一个类似指针的东西。

vector<typename>::iterator it;

这样it就是一个vector<typename>::iterator型的变量,其中typename就是定义vector时写的变量,下面用int,double 为例

vector<int>::iterator it;
vector<double>::iterator it;

我们得到了迭代器it,并且可以通过*it来访问vector里的元素。

vector<int> vi;
for(int i = 1; i <= 5; i++){
	vi.push_back(i);	//push_back(i)在vi的末尾添加元素i,即依次添加1 2 3 4 5
}

然后我们来访问一下

#include<vector>
#include<iostream>
using namespace std;
int main(){
	vector<int> vi;
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}
	//vi.begin()为取vi首元素的地址,而it指向这个地址
	vector<int>::iterator it = vi.begin();
	for(int i = 0; i < 5; i ++){
		printf("%d ", *(it + i));
	} 
	return 0;
} 

我们可以看出

vi[ i ] 和 *(vi.begin() + i)等价

既然我们提到了begin()函数的作用是取首地址,那么这里还要提到end()函数,和begin()不同的是,end()并不是取vi尾元素的地址,而是去尾元素地址的下一个地址,end()作为迭代器末尾的标志,不存储任何元素

除此之外,迭代器还是实现了两种自加操作:it++ 和 ++it(自减同理)于是另一种遍历方法诞生了

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}
	//vector的迭代器不支持it < vi.end()的写法,因此循环条件只能用it != vi.end()
	for(vector<int>::iterator it = vi.begin(); it != vi.end(); it++){
		printf("%d ", *it);
	} 
	return 0;
}

在STL容器中,只有在vector和string 中,才允许使用vi.begin() + 3这种迭代器+整数的写法。

3)几个函数的用法

(1)push_back()

顾名思义,push_back(x)就是在vector后面添加一个元素,时间复杂度为 O(1);

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}
	for(int i = 0; i < vi.size(); i++){
		cout << vi[i] << " ";
	}
	return 0;
}

(2)pop_back()

有添加就会有删除,这个函数的作用就是删除 vector 的尾元素,时间复杂度为 O(1)

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}
	vi.pop_back();
	for(int i = 0; i < vi.size(); i++){
		cout << vi[i] << " ";
	}
	return 0;
}

(3)size()

size()函数用来获得vector中元素的个数时间复杂度为 O(1),注意一点 size()返回的是unsigned类型,不过一般用 %d不会有太大问题,这一点对所有STL容器都一样

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}
	cout << vi.size() << endl;
	return 0;
}

(4)clear()

用来清空vector中的所有元素,时间复杂度为O(N),N为vector中元素的个数

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}
	vi.clear();
	cout << vi.size() << endl;
	return 0;
}

(5)insert()

insert(it, x)用来想vector 的任意迭代器it处插入一个元素x,时间复杂度为 O(N)

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}
	vi.insert(vi.begin() + 2, -1);
	for(int i = 0; i < vi.size(); i++){
		cout << vi[i] << " ";
	}
	return 0;
}

(6)erase()

两种用法,删除单个元素,删除一个区间内所有的元素,时间复杂度均为O(N)

  1. 删除单个元素
#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}
	vi.erase(vi.begin() + 3);
	for(int i = 0; i < vi.size(); i++){
		cout << vi[i] << " ";    //1 2 3 5
	}
	return 0;
}
  1. 删除一个区间内

注意一点,erase(left, right),删除 [ left,right)内所有元素

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;
int main(){
	vector<int> vi;
	for(int i = 1; i <= 5; i++){
		vi.push_back(i);
	}
	vi.erase(vi.begin() + 1, vi.begin() + 4);
	for(int i = 0; i < vi.size(); i++){
		cout << vi[i] << " ";// 1 5
	}
	return 0;
}

删一个区间内

vi.erase(vi.begin(), vi.end());

猜你喜欢

转载自blog.csdn.net/Harington/article/details/87865026