1.STL-vector
向量是可以改变其大小的线性序列容器。向量使用连续的空间存储元素,表明向量可以像数组通过下标来访问元素,但是向量的大小可以动态变化。向量的容量可能大于其元素需要的实际容量,向量通过消耗更多的内存来换取存储管理效率。
具体用法
(1)vector的定义
使用向量vector标准模版,在代码中添加头文件,格式为#include<vector>。定义一个向量vector:vector<typename> name。
(2)vector用作判断的状态
返回当前向量是否为空:empty()
返回当前向量元素个数:size()
(3)vector尾部元素的添加或删除
向量尾部添加新元素:push_back();向量尾部删除元素:pop_back()
(4)vector元素的访问
可以通过像数组一般通过元素下标进行访问,下标从0到size()-1。
可以通过迭代器进行访问,类似于指针。
(5)vector元素操作
在任意位置插入元素:insert();在任意位置删除元素:erase(),将向量清空:clear()。
(6)vector迭代器操作
返回向量中的首元素的迭代器:begin(),返回向量中尾元素后一个位置的迭代器end()。
示例代码
#include <iostream>
#include <vector>
using namespace std;
vector<int> myVector;
int main(){
for(int i=0;i<5;++i){
myVector.push_back(i); //从尾部逐一添加元素
}
myVector.insert(myVector.begin(),3,15); //头部插入3个15
myVector.pop_back();
for(int i=0;i<myVector.size();++i){
cout<<myVector[i]<<" ";
}
cout<<endl;
cout<<"the 5th element of myVector:"<<myVector[4]<<endl;
cout<<"the size of myVector:"<<myVector.size()<<endl;
myVector.erase(myVector.begin()+5,myVector.end()); //删除第5后续的元素
vector<int>::iterator it; //定义迭代器
for(it=myVector.begin();it!=myVector.end();it++){
cout<<*it<<" "; //遍历向量
}
cout<<endl;
myVector.clear();
return 0;
}
2.list的使用
和vector基本相似,两者所支持的操作基本一致,底层原理是双向链表。
做题时,优先使用vector,如果发现效率低,可以换成list。
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> ls1={1,3,5,7,9};
list<int>::iterator it=ls1.begin();
//it=it+2; 链表不支持随机访问,故不支持加法运算符
++it;//只支持自增运算符
++it;
cout<<"*it="<<*it<<endl;
ls1.erase(it); //list中使用erase和insert效率更高一些
for(it=ls1.begin();it!=ls1.end();++it){
cout<<"after erase,*it="<<*it<<endl;
}
return 0;
}
3.向量的应用例题(清华大学上机题)
链接:http://t.cn/AiKEyQWW
【分析】由于完数和盈数的数量未知,数组大小未知,可以采用vector变长数组。
向量vector不仅能够解决输入/输出数据量不确定问题,还能实现图论中邻接表。
本文会持续完善和更新~