vector
vector(向量):是一种顺序容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而vector正好弥补了这个缺陷,它的特征是相当于可分配拓展的数组,它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。
-
vector初始化
-
vector操作
vector<int> v1; v1.push_back() //在数组的最后添加一个数据 v1.pop_back() //去掉数组的最后一个数据 v1.front() //返回第一个元素(栈顶元素) v1.begin() //得到数组头的指针,用迭代器接受 v1.end() //得到数组的最后一个单元+1的指针,用迭代器接受 v1.clear() // 移除容器中所有数据 v1.empty() //判断容器是否为空 v1.erase(pos) //删除pos位置的数据,指针依旧指着该位置 v1.erase(beg,end)// 删除[beg,end)区间的数据 v1.size() //回容器中实际数据的个数 v1.insert(pos,data) //在pos位置前插入数据
使用迭代器遍历的方式
vector<string> v6 = { "hi","my","name","is","lee" }; for (vector<string>::iterator iter = v6.begin(); iter != v6.end(); iter++) { cout << *iter << endl; //下面两种方法都行 cout << (*iter).empty() << endl; cout << iter->empty() << endl; }
List
顺序容器,List的优势在于可以在常规时间内,在序列已知的任何位置删除和插入数据,而缺点则是无法通过位置索引来直接访问已存储的数据。
-
list初始化
list<int> lst1; //创建空list list<int> lst2(3); //创建含有三个元素的list list<int> lst3(3,2); //创建含有三个元素的值为2的list list<int> lst4(lst2); //使用lst2初始化lst4 list<int> lst5(lst2.begin(),lst2.end()); //同lst4
-
list操作
// 添加元素 list<int> lst1; lst1.push_front(val); // 在链表的首部添加元素val,即val所在结点为list5的头结点 lst1.push_back(val); // 在链表的尾部添加元素val, 即list5的最后一个结点后向指针指向val所在结点 lst1.emplace_front(val); // 同push_front() lst1.emplace_back(val); // 同epush_back() 但效率更高 // 插入元素 list5.insert(list5.begin()+1, 2, 5);//在list5的第二个位置插入2个5 list5.insert(list5.begin()+1, 5);//在list5的第二个位置插入5 // 删除元素 list5.unique(); // 删除list5中重复元素 list5.pop_front(); // 删除list5的头结点 list5.pop_back(); // 删除list5的尾结点 list5.remove(val); // 删除list5中元素等于val的结点 list5.remove_if([](int n){return n%2 == 0;}); // 删除元素值为偶数的结点 list5.erase(list5.begin()+2); // 删除第3个元素 list5.clear(); lst1.begin(); //返回首值的迭代器 lst1.end(); //返回尾值的迭代器 lst1.clear(); //清空值 lst1.empty(); //判断为空 lst1.front(); //返回第一个元素的引用 lst1.back(); //返回最后一个元素的引用 lst1.rbegin(); //返回第一个元素的前向指针 lst1.reverse(); //反转 lst1.size(); //含有元素个数 lst1.sort(); //排序 lst1.unique(); //删除相邻重复元素
stack
容器修饰器
-
stack用法
stack<int> s; s.empty() // 堆栈为空则返回真 s.pop() // 移除栈顶元素 s.push() // 在栈顶增加元素 s.size() // 返回栈中元素数目 s.top() // 返回栈顶元素
queue
容器修饰器
-
queue用法
queue<int> q; q.push(x); // 将x接到队列的末端。 q.pop(); // 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。 q.front(),// 最早被压入队列的元素。 q.back(),// 最后被压入队列的元素。 q.empty(),// 当队列空时,返回true。
priority_queue
容器修饰器,相比于queue,不同的地方在于,插入的元素都是有序的。
-
优先队列用法
// Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector) priority_queue<Type, Container, Functional> // 升序队列 priority_queue <int,vector<int>,greater<int> > q; // 降序队列 priority_queue <int,vector<int>,less<int> >q;
set
关联容器,set跟vector差不多,它跟vector的唯一区别就是,set里面的元素是有序的且唯一的,只要你往set里添加元素,它就会自动排序。可以使用迭代器遍历
-
set初始化
set<int> a; // 定义一个int类型的集合a set<int> b(a); // 定义并用集合a初始化集合b set<int> b(a.begin(), a.end()); // 将集合a中的所有元素作为集合b的初始值
-
set操作
set<int> s; s.begin(); // 返回指向第一个元素的迭代器 s.clear(); // 清除所有元素 s.count(x); // 返回某个值元素的个数 s.empty(); // 如果集合为空,返回true s.end(); // 返回指向最后一个元素的迭代器 s.erase(x); // 删除集合中的元素 s.find(x); // 返回一个指向被查找到元素的迭代器,不存在返回s.end() s.insert(x); // 在集合中插入元素 s.lower_bound(); // 返回指向大于(或等于)某值的第一个元素的迭代器 s.rbegin(); // 返回指向集合中最后一个元素的反向迭代器 s.rend(); // 返回指向集合中第一个元素的反向迭代器 s.size(); // 集合中元素的数目 s.swap(s1); // 交换两个集合变量 s.upper_bound(); // 返回大于某个值元素的迭代器 // 自定义排序 set<int, myComp> s1;
unordered_set
基于于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存,无自动排序功能。可以使用迭代器遍历。
map
关联容器,map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。可以使用迭代器遍历。
- map的操作
map<int, string> mapStudent;
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
// 第二种 用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "student_one"));
// 第三种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";
// 查找
// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapStudent.find("123");
if(iter != mapStudent.end())
cout<<"Find, the value is"<<iter->second<<endl;
else
cout<<"Do not Find"<<endl;
// 自定义比较函数
struct cmp_key
{
bool operator()(const A &k1, const A &k2)const
{
if(k1.value != k2.value)
{
return k1.dwBussID < k2.dwBussID;
}
}
};
map<A, A, cmp_key> a;