C++ STL常用方法 ——vector、map、set、unordered_map、unordered_set

一、map

1.map简介

map是一种关联式容器,一对一的映射

  • 第一个是key,是唯一的。
  • 第二个是value,关键字所对应的值。

因为map的底层实现是红黑树,所以map会对插入的数据进行排序。

2.插入元素

采用insert直接下标访问两种方式,同时可以看到输出是按照key值排序。

#include"map"
int main() {
    map<int,string> um;
    um.insert(pair<int,string>(2,"steve"));
    um[1]="antonio";

    //访问方式,可以看到插入的元素最后会按照key值排序
    for (auto item:um) {
        cout<<item.first<<"  "<<item.second<<endl;
    }
    //1  antonio
    //2  steve
    return  0;
}

3.查找元素

查找key出现的位置,如果没有在map中,则返回end(指向尾部的迭代器)

#include"map"
int main() {
    map<int,string> um;
    um.insert(pair<int,string>(2,"steve"));
    um[1]="antonio";

    if(um.find(2)!=um.end())
        cout<<"have found"<<endl;
    else
        cout<<"not found"<<endl;
    return  0;
}

4.map常用成员方法

begin() 返回指向map头部的迭代器

end() 返回指向map末尾的迭代器

rbegin() 返回一个指向map尾部的逆向迭代器

rend() 返回一个指向map头部的逆向迭代器

clear() 删除所有元素

count() 返回指定元素出现的次数

empty() 如果map为空则返回true

erase() 删除一个元素

find() 查找一个元素

insert() 插入元素

lower_bound() 返回键值>=给定元素的第一个位置

size() 返回map中元素的个数

5.map和unordered_map比较

在数据量小的时候,unordered_map比map慢

原因在于unordered_map的初始化比较耗时,我们都知道map是红黑树,unordered_map是哈希表,造成性能差异的原因在于,红黑树初始化时,节点只需要一个,后续的插入只是插入新的节点,但是哈希表初始化时就不是那么简单了,哈希表初始化时需要申请一个数组,数组的每个元素都指向一条链表,所以初始化时需要申请很多内存,相比于map,的确更耗时。

 

二、set

1.set简介

set只保存一个元素,就是key。

set底层实现同样是红黑树,故而内部数据是会排序好。

2.set的插入和遍历

采用insert方法插入。

#include"set"
int main() {
    set<int> us;
    us.insert(3);
    us.insert(1);
    us.insert(2);
    
    //1 2 3
    for (auto item:us) {
        cout<<item<<" ";
    }
    return  0;
}

3.set常用成员方法

begin()        返回set容器的第一个元素

end()      返回set容器的最后一个元素

rbegin()     返回的值和end()相同

rend()     返回的值和rbegin()相同

clear()          删除set容器中的所有的元素

empty()     判断set容器是否为空

size()      返回当前set容器中的元素个数

三、 unordered_map

1.简介

unordered_map是一种关联式容器,一对一的映射

  • 第一个是key,是唯一的。
  • 第二个是value,关键字所对应的值。

底层实现是hash表,故而其内的元素是无序的。

其中hash是使用的拉链法解决冲突。如下图所示

 

2.元素初始化

插入有常用的两种方式,赋值常用量两种方式。

#include"unordered_map"
#include "iostream"
using namespace std;
//对unordered_map<int,string>使用别名int_string
typedef unordered_map<int,string> int_string;
int main() {
    //初始化的几种方法
    int_string one={{3,"bash"},{1,"java"}};
    one[4]="python";//直接下标插入元素
    one.insert(pair<int,string>(2,"c++"));//使用成员方法insert插入元素

    int_string two ( one );       // 用数组初始
    int_string three ( two.begin(),two.end());   // 范围初始化

    //访问方式
    for (auto item:three) {
        cout<<item.first<<"  "<<item.second<<endl;
    }
    return  0;
}

 

3.常用成员方法

begin()    指向第一个元素
end()       指向最后一个元素的迭代器
empty()   判别是否为空
size()      所有键值对的数量
insert()    插入一对元素
erase()    删除指定的键值对
find()       查找元素,如果存在返回的是key值对应的迭代器,如果不存在返回的是end()

四、 unordered_set

1.简介

只保存关键词key

底层实现是hash表,故而其内的元素是无序的。

2.数据初始化

#include"iostream"
#include"unordered_set"
using namespace std;
typedef unordered_set<int> US;
int main() {
    US us;
    us.insert(2);
    us.insert(1);
    US one(us);//one=us;是等价的
    US two(one.begin(),one.end());

    //访问方式
    for (auto item:two) {
        cout<<item<<endl;
    }
    return  0;
}

 

五、vector

1.简介

vector是序列式容器,按照下表访问。

2.数据初始化

含有一维数组和二维数组的初始化

#include"vector"
using namespace std;
typedef vector<int> Vector;
int main() {
    Vector vec(10,5);
    Vector vec1(vec); //Vector vec1=vec这两种方式是等价的
    Vector vec2(vec.begin(),vec.end());
    Vector vec3={1,2,3,4};
    Vector vec4(10);//初始化数组的大小是10,value是0
    Vector vec5(10,1);//初始化数组的大小是10,value是1
    //二维矩阵的初始化
    vector<vector<int>> ans(12,vector<int>(10,0));
    vector<vector<int>> ans1(ans);
    return  0;
}

3.常用成员方法

begin()        指向第一个元素的迭代器
end()           指向最后一个元素的下一个位置的迭代器
empty()       判别是否为空
size()          存储的数据量
insert()        插入元素
push_back()    在尾部插入元素
pop_back()      将尾部元素弹出

#include"iostream"
#include"vector"
using namespace std;
typedef vector<int> Vector;
int main() {
    Vector vec;
    vec.push_back(1);//push元素到末尾
    vec.push_back(2);
    vec.push_back(3);
    vec.insert(vec.begin()+1,-1);

    //1 -1 2 3
    for (int i = 0; i < vec.size(); ++i) {
        cout<<vec[i]<<" ";
    }
    vec.pop_back();//将元素弹出
    //1 -1 2
    for (int i = 0; i < vec.size(); ++i) {
        cout<<vec[i]<<" ";
    }
    return  0;
}

 

posted @ 2019-11-15 09:25  suwenyuan  阅读(1845)  评论(0编辑  收藏  举报