vector map set"/>
[C++] STL vector map set
Vector
可以理解为动态数组,可存储重复元素。
初始化:
vector<int> a; vector<int> a(5); //5 elements is 0 vector<int> a(5,8); //5 elements is 8//数组初始化vector int a[] = {1,2,3}; vector<int> haha(a,a + sizeof(a)/sizeof(int));//二维vector vector<vector<int>> matrix(n,m); // n rows; m cols vector<vector<int>> matrix(n,vector<int>(m,9)); // n rows; m cols; all elements is 9
访问:
a[i] //不检查越界 a.at(i) //访问越界抛异常
迭代:
for(vector<int>::iterator iter = a.begin();iter != a.end();iter++) //迭代器 for(int i = 0;i < a.size();i++) //指针
其他函数:
.size(); .push_back(); .pop_back(); .clear(); .resize();.capacity(); .reserve(); .erase(); .empty(); .count(); //a.size() <= a.capacity()
find 在vector中并没有自带的.find方法,可以使用普通的find函数完成功能。
vector<int> a; int b = ****; vector<int>::iterator iter = find(a.begin(),a.end(),b); if(find(a.begin(),a.end(),b) == a.end()) {cout<<"Not find!"<<endl; }
其中 .erase()这个函数在使用时要特别注意。 .size()减少了一,.capacity()不变。
使用迭代器iterator访问时, .erase()之后,这个iterator就指向下一个了,此时执行iterator++就会跳过一个元素未访问。
for(vector<int>::iterator iter = nums.begin();iter != nums.end();) {if(! *iter) //去掉vector中的0元素 {nums.erase(iter);}else{iter++;} }
.size()的返回值是无符号整型,在循环中,如果遇到空vector时进行 -1 操作会出问题。
vector<int> haha; for(int i = 0;i < haha.size() - 1;i++) {cout<<"haha"<<i<<endl; } int vSize = haha.size(); for(int i = 0;i < vSize;i++) {cout<<"hehe"<<i<<endl; }
output: haha1
不会输出hehe1,因为.size()的返回值是无符号整型,因此使用时要注意!
插一个不错的表格,转自
Map
关联容器(key-value),key不能重复,对key自动排序。
map<int,string> a;
插入元素:(第一种和第二种的效果相同,对已有的key值,不进行插入操作。第三种指针型的,能够对已有的key值进行覆盖。)
a.insert(pair<int,string>(2,"haha")); a.insert(map<int,string>::value_type(2,"haha")); a[2] = "haha";
删除:
a.erase(iter); //迭代器 a.erase(key); //键值 a.erase(a.begin(),a.end()); //成片删除,前闭后开
搜索和访问:
iter = a.find(key); iter->first //key iter->second //value
Set
集合,有序,不包含重复元素,元素值唯一(与vector的主要区别)。集合内元素都是排列好的,所有的存取插入操作都在log(n)内完成。
set不能直接改变元素值,这样会改变原有的正确顺序,必须先删除旧元素,再插入新元素。
set<int> a; set<int,myFunc> a; //使用自定义的比较函数进行排序
struct myFunc {bool operator()(const char* s1,const char* s2){return strcmp(s1,s2) < 0;} }const char* carray[] = {"abc","def","xyz"}; set<const char* ,myFunc> a(carray,carray+3,myFunc());
set不可直接访问下标!!!只能用迭代器。
set<string> a; set<string>::iterator iter; for(iter = a.begin();iter != a.end();iter++)
用vector初始化set.
vector<string> list1; set<string> _list1; _list1.insert(list1.begin(),list1.end());
判断插入元素是否成功用.second
if(a.insert(7).second)
判断元素是否属于集合
if(a.find(4) != a.end())
集合的并,交和差(注意在此前要将c清为空集)
#include<algorithm>
#include<iterator>
set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin())); set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin())); set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iterator<set<int> >(c,c.begin()));
Reference
.html .html
转载于:.html
更多推荐
[C++] STL vector map set
发布评论