目录
一:Vector 向量
Vector 包含着一系列连续存储的元素,其行为和数组类似。
访问Vector中的任意元素(随机访问)或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置(find)或是在Vector中插入元素(insert)则是线性时间复杂度。
1:声明和初始化
vector<int> a;
vector<int> a(10); //为vector分配十个空间,默认值都为0
vector<int> a(10, 1); //十个默认值均为1
vector<int> b(a); //用a初始化b
vector<int> b(a.begin(), a.begin()+3); //用a的前三个元素初始化b
//assign()
vector<int> c;
c.assign(a.begin(), a.end()); //assign初始化,用a初始化c
c.assign(10,1); //十个值为1
//用数组
int arr[5] = {1,2,3,4,5};
vector<int> a(arr, arr+n); //用数组前n个元素初始化a
2:遍历方式
//方式1
int arr[] = {1,2,3};
vector<int> a(arr, arr+3);
for(int i = 0; i < a.size(); i++) {
cout << a[i] << ' ';
}
//方式2,迭代器
for(vector<int>::iterator it=a.begin(); it!=a.end(); it++) {
cout << *it << ' ';
}
3:常用函数
- size() 返回容器容量
- clear() 清空容器
- empty() 返回容器是否为空
- push_back() 向容器末尾插入一个元素
- pop_back() 删除容器最后一个元素,返回空
- front() 返回容器第一个元素
- back() 返回容器最后一个元素
- begin() 返回第一个元素的迭代器
- end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
- rbegin() 返回vector尾部的逆迭代器
- rend() 返回vector起始的逆迭代器
- swap() 交换两个向量的元素
- insert() 插入元素,比较重要,有三种用法
1:iterator insert( iterator loc, const TYPE &val );
在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器。
int arr[] = {1,2,3};
vector<int> vec(arr, arr+3);
auto it = vec.insert(vec.begin(), 10);
cout << *it << endl;
for(it = vec.begin(); it!=vec.end(); it++)
cout << *it << endl;
//输出
10
10
1
2
3
2:void insert( iterator loc, size_type num, const TYPE &val );
在指定位置loc前插入num个值为val的元素
int arr[] = {1,2,3};
vector<int> vec(arr, arr+3);
vec.insert(vec.begin(), 3, 1);
for(auto it = vec.begin(); it!=vec.end(); it++)
cout << *it << endl;
//输出
1
1
1
1
2
3
3: void insert( iterator loc, input_iterator start, input_iterator end);
在指定位置loc前插入区间[start, end)的所有元素
int arr[] = {1,2,3};
vector<int> vec(arr, arr+3);
vector<int> vv(3, 5);
vec.insert(vec.begin(), vv.begin(), vv.end());
for(auto it = vec.begin(); it!=vec.end(); it++)
cout << *it << endl;
//输出
5
5
5
1
2
3
- erase() 删除指定元素,常用
1:iterator erase( iterator loc );
删除指定元素位置loc的元素,返回loc后元素
2:iterator erase( iterator start, iterator end );
删除[start, end)区间的元素,返回end下一个元素
int arr[] = {1,2,3,4};
vector<int> vec(arr, arr+4);
auto it = vec.erase(vec.begin());
cout << *it << endl;
it = vec.erase(vec.begin(), vec.begin()+2);
cout << *it << endl;
//输出
2
4
在使用迭代器遍历过程中删除元素要注意迭代器会失效。
二:List 链表
不支持随机访问,允许快速的插入和删除。
List将元素按顺序储存在链表中. 与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。
1:声明和初始化
和vector基本相同
2:遍历
只能使用迭代器遍历!!
3:常用函数:
- begin() 返回第一个迭代器
- end() 返回末尾的迭代器
- rbegin() 返回指向第一个元素的逆迭代器
- rend() 返回指向末尾的逆迭代器
- front() 返回第一个元素
- clear() 清空容器
- empty() 返回容器是否为空
- size() 返回元素个数
- push_back() 末尾插入一个元素
- push_front() 头部插入一个元素
- pop_back() 删除最后一个元素
- pop_front() 删除第一个元素
- swap() 交换两个链表的元素
- remove() 删除所有指定元素
- remove_if() 按指定条件删除元素
//条件函数
bool condition(int i) {
return i==1;
}
int main() {
// freopen("i.txt", "r", stdin);
// freopen("o.txt", "w", stdout);
int arr[] = {1,2,3,4,1,1};
list<int> l(arr, arr+4);
l.remove_if(condition); //等同于l.remove(1);
for(auto it=l.begin(); it!=l.end(); it++)
cout << *it << endl;
//输出
2
3
4
- reverse() 逆转链表
- unique() 删除链表中重复的元素
- sort() 链表排序(以上为list自带,无参数)
- merge() 合并两个链表
int arr[] = {1,2,3,4};
list<int> l(arr, arr+4);
list<int> ll(2,9);
l.merge(ll);
for(auto it=l.begin(); it!=l.end(); it++)
cout << *it << endl;
//输出
1
2
3
4
9
9
- splice() 合并两个链表
1:void splice( iterator pos, list &lst );
把lst链表连接到pos的位置。
2:void splice( iterator pos, list &lst, iterator del );
把lst链表del位置的元素插入到pos位置
3:void splice( iterator pos, list &lst, iterator start, iterator end );
把lst链表[start, end)区间内元素插入到pos位置
三:Map 图
C++ Maps是一种关联式容器,包含“关键字/值”对
1:声明和初始化
//map有多个构造函数
map<string, string> map1;
//最常用
map["map1"] = "c++";
//拷贝
map<string, string> map2(map1);
map<string, string> map3(map1.begin(), map1.end());
2:遍历方式
map<string, string> map1;
map1["c++"] = "a";
map2["cpp"] = "b";
for(map<string,string)::iterator it=map1.beging(); it!=map1.end(); it++) {
// map的迭代器,可以用 first 访问std::pair的第一个成员,second 访问第二个成员
cout << it->first << " " << it->second << endl;
}
3:常用函数
- begin(),end() 返回指向map头部,尾部的迭代器
- rbegin(),rend() 返回指向map尾部,头部的逆向迭代器
- clear() 删除所有元素
- count() 返回指定元素出现的个数
- empt() 如果为空返回true
- size() 返回元素个数
- find() 返回一个指向键值为key的迭代器,如果没找到就返回指向map尾部的迭代器
map<string, string> map1;
map1["map1"] = "1";
map1["map2"] = "2";
map1["map3"] = "3";
map<string, string>::iterator it = map1.find("map1");
cout << it->first << " " << it->second << endl;
map<string, string>::iterator it2 = map1.find("1");
cout << (it2==map1.end()) << endl;
//输出
map1 1
1
-
lower_bound() 返回键值>=给定元素的第一个位置
-
upper_bound() 返回键值>给定元素的第一个位置
map<string, string> map1;
map1["map1"] = "1";
map1["map2"] = "2";
map1["map3"] = "3";
map<string, string>::iterator it = map1.lower_bound("map2");
cout << it->first << " " << it->second << endl;
it = map1.upper_bound("m");
cout << it->first << " " << it->second << endl;
//输出
map2 2
map1 1
-
insert() 插入
1:iterator insert( iterator pos, const pair<KEY_TYPE, VALUE_TYPE > &val );
插入val到pos的后面,然后返回一个指向这个元素的迭代器。
在map中无作用,因为map会自动排序
2:void insert( input_iterator start, input_iterator end );
插入start到end的元素到map中
3:pair<iterator, bool> insert( const pair<KEY_TYPE, VALUE_TYPE> &val )
只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值
map<string, string> map1;
map1["bbb"] = "1";
map1["aaa"] = "2";
pair<map<string, string>::iterator, bool> it = map1.insert(make_pair<string, string>("ccc", "2"));
map<string, string>::iterator itt = it.first;
cout << itt->first << " " << itt->second << endl;
cout << it.second << endl;
//输出
ccc 2
1
-
erase() 删除元素
都会使迭代器失效
1:void erase( iterator pos );
删除指定位置元素
2:void erase( iterator start, iterator end );
删除[start, end)元素
3:size_type erase( const KEY_TYPE &key);
删除键值为key的元素,返回个数
四:Set 集合
集合(Set)是一种包含已排序对象的关联容器
一:遍历方式
迭代器遍历
二:常用函数
- begin(),end() 返回指向set头部,尾部的迭代器
- rbegin(),rend() 返回指向set尾部,头部的逆向迭代器
- clear() 删除所有元素
- count() 返回指定元素出现的个数
- empt() 如果为空返回true
- size() 返回元素个数
- lower_bound() 返回键值>=给定元素的第一个位置
- upper_bound() 返回键值>给定元素的第一个位置
- find() 返回一个指向键值为key的迭代器,如果没找到就返回指向set尾部的迭代器
- insert() 插入元素
1:iterator insert( iterator pos, const TYPE &val );
插入val到pos的后面,然后返回一个指向这个元素的迭代器。
在set中无作用,因为set会自动排序
2:void insert( input_iterator start, input_iterator end );
插入start到end的元素到set中
3:pair<iterator, bool> insert( const TYPE &val )
只有在val不存在时插入val。返回值是一个指向被插入元素的迭代器和一个描述是否插入的bool值
- erase() 删除元素
都会使迭代器失效
1:void erase( iterator pos );
删除指定位置元素
2:void erase( iterator start, iterator end );
删除[start, end)元素
3:size_type erase( const KEY_TYPE &key);
删除键值为key的元素,返回个数
五:Stack 栈
C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构。
empty() | 堆栈为空则返回真 |
pop() | 移除栈顶元素 |
push() | 在栈顶增加元素 |
size() | 返回栈中元素数目 |
top() | 返回栈顶元素 |
六:Queue 队列
C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。
back() | 返回最后一个元素 |
empty() | 如果队列空则返回真 |
front() | 返回第一个元素 |
pop() | 删除第一个元素 |
push() | 在末尾加入一个元素 |
size() | 返回队列中元素的个数 |
七: Double Ended Queues(双向队列)
双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)。
比向量相比(其他均相同):
pop_back() | 删除尾部的元素 |
pop_front() | 删除头部的元素 |
push_back() | 在尾部加入一个元素 |
push_front() | 在头部加入一个元素 |
八:Priority Queues(优先队列)
empty() | 如果优先队列为空,则返回真 |
pop() | 删除第一个元素 |
push() | 加入一个元素 |
size() | 返回优先队列中拥有的元素的个数 |
top() | 返回优先队列中有最高优先级的元素 |