[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()的返回值是无符号整型,因此使用时要注意!

插一个不错的表格,转自http://blog.csdn.net/phoebin/article/details/3864590

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

http://www.cppblog.com/huyutian/articles/107457.html
http://blog.csdn.net/wu_lai_314/article/details/8439556
http://blog.csdn.net/wu_lai_314/article/details/8440550
http://blog.csdn.net/wu_lai_314/article/details/8440655
http://www.cnblogs.com/vegg117/p/3949717.html
http://blog.csdn.net/a576699534/article/details/46502849
原文地址:https://www.cnblogs.com/zhanxiage1994/p/6904500.html