【C++】关联式容器-map和set-创新互联
文章目录
分享标题:【C++】关联式容器-map和set-创新互联
地址分享:http://azwzsj.com/article/dcjshp.html
- 关联式容器
- 键值对
- set
- 基本介绍
- set的模板参数列表
- set的构造
- set的迭代器
- set的修改操作
- map
- 基本介绍
- map的模板参数说明
- map的构造
- map的迭代器
- map的元素访问
- map中元素的修改
- map总结
STL中的容器分为两大类:序列式容器和关联式容器。
序列式容器有vector、list、deque、forward_list等,为什么他们被称为序列式容器呢?因为他们的底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是
键值对用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
SGI-STL中关于键值对的定义:
struct pair
{typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair():first(T1()),second(T2())//零初始化
{}
pair(const T1& a,const T2& b):first(a),first(b)
{}
};
有下面这几种方法来构造键值对:
int main()
{pairv;//v被定义为键值对类型,那就有了两个成员变量
v.first = 1;
v.second = "hello";
cout<< v.first<< " : "<< v.second<< endl;//1 : hello
pairv1(2, "Linux");
cout<< v1.first<< " : "<< v1.second<< endl;//2 : Linux
v = v1;
cout<< v.first<< " : "<< v.second<< endl;//2 : Linux
pairv2 = make_pair(3, "C++");
cout<< v2.first<< " : "<< v2.second<< endl;//3 : C++
return 0;
}
set
基本介绍- set是按照一定次序存储元素的容器。
- 在set中,元素的value也标识它,value就是key,类型为T,并且每个value必须是唯一的。set中的元素不能在容器中修改,但是可以在容器中进行插入和删除。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但是它们允许根据顺序对子集进行直接迭代。
- set在底层是用红黑树实现的。
注意:
- 与map不同,map中存储的是真正的键值对
,set中只放value,但是在底层实际存放是由 构成的键值对。 - set中插入元素时,只需要插入value即可,不需要构造键值对。
- set中的元素不可以重复
- 使用set的迭代器遍历set中的元素,可以得到有序序列
- set中的元素默认按照小于来比较
- set中查找某个元素,时间复杂度为以2为底n的对数。
- set中的元素不允许修改
验证set中的元素默认按照小于进行排序:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
for (const auto &e : is)
cout<< e<< " ";//1 2 3 4 5 6 7 8 9
cout<< endl;
}
如果想要从大到小排序,则在构造的时候加上greater:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
set>is(iv.begin(), iv.end());
for (const auto &e : is)
cout<< e<< " ";//9 8 7 6 5 4 3 2 1
cout<< endl;
}
set的模板参数列表template, class Alloc = allocator>class set;
set的构造T:set中存放元素的类型,实际在底层存储
的键值对
Compare:set中元素默认按照小于来比较
Alloc:set中元素空间的管理方式,使用STL提供的空间配置器。
void main()
{sets1;//构造空的set
int ar[] = {8,5,3,7,6,4,2,9,1 };
int n = sizeof(ar) / sizeof(ar[0]);
sets2(ar, ar + n);//用(first,last)区间中的元素构造set
vectorvi = {8,5,3,7,6,4,2,9,1 };
sets3(vi.begin(), vi.end());//用(first,last)区间中的元素构造set
s1 = s3;//拷贝构造
}
set的迭代器set的修改操作函数声明 | 功能 |
---|---|
pair | 在set中插入元素x,实际插入的是 |
size_type erase ( const key_type& x ) | 删除set中值为x的元素,返回被删除的元素的个数 |
void erase ( iterator position ) | 删除set中position位置上的元素 |
void erase ( iterator first, iterator last ) | 删除set中(first,last)区间中的元素 |
size_type count ( const key_type& x ) const | 返回set中值为x的元素的个数 |
void swap ( set | 交换set中的元素 |
swap代码验证:
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
vectoriv1 = {6,7,8,3 };
setis1(iv1.begin(), iv1.end());
is1.swap(is);
}
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
setis(iv.begin(), iv.end());
auto res = is.lower_bound(7);//>=7
//auto res = is.upper_bound(6);//>6
cout<< *res<< endl;
}
map
基本介绍- map是关联式容器,按照特定次序(按照key来进行比较)存储由键值key和值value组合而成的元素
- 在map中,键值key通常用于排序和唯一的标识元素,而值value中存储与键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair。
typedef pair value_type;
- 在内部,map中的元素总是按照键值key进行比较排序的。
- map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代。
- map支持下标访问符,即在[]中放入key,就可以得到与key对应的value。
- map底层通常被实现为红黑树。
template,//比较器的类型
class Alloc = allocator>//通过空间配置器来申请底层空间
>class map;
map的构造void main()
{mapismap;
mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
}
map的迭代器map的元素访问函数声明 | 功能 |
---|---|
size_type size() const | 返回map中有效元素的个数 |
mapped_type& operator[] (const key_type&k) | 返回key对应的value |
void main()
{mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
cout<< ismap.size()<< endl;//3
cout<< ismap.at(4)<< endl;//Job
cout<< ismap[4]<< endl;//Job
cout<< ismap[8]<< endl;//""
//cout<< ismap.at(9)<< endl;//会抛出异常
}
在元素访问时,at函数和operator[]都能通过key找到与key对应的value然后返回其引用,不同的是:当key不存在时,operator[]用默认value和key构造键值对然后插入,返回该默认value,at()函数直接抛出异常。
map中元素的修改函数声明 | 功能 |
---|---|
pair | 在map中插入键值对x,返回值也是一个键值对,iterator代表新插入元素的位置,bool代表是否插入成功 |
size_type erase ( const key_type& x ) | 删除值为x的元素 |
void erase ( iterator position ) | 删除position位置上的元素 |
void erase ( iterator first, iterator last ) | 删除(first,last)区间中的元素 |
size_type count ( const key_type& x ) const | 返回set中值为x的元素的个数 |
void swap ( set | 交换set中的元素 |
const_iterator find ( const key_type& x )const | 在map中查找key为x的元素,找到返回该元素的位置的const迭代器,否则返回cend |
size_type count ( const key_type& x ) const | 返回key为x的键值在map中的个数,注意map中key是唯一的,因此该函数的返回值要么为0,要么为1,因此可以用来检测一个key是否在map中 |
查找和插入:
void main()
{//2 4 5 8
mapismap = {{5,"Student"},
{2, "Teacher"}, {8, "Study"}, {4, "Job"} };
auto pos = ismap.find(8);//查找,找到返回该元素的迭代器
cout<< pos->first<< " : "<< pos->second<< endl;
pairv = {1,"abc" };
ismap.insert(pos, v);//插入,pos表示新插元素的位置
cout<< pos->first<< " : "<< pos->second<< endl;
for (const auto& e : ismap)
cout<< e.first<< " : "<< e.second<< endl;
}
map总结- map中的元素是键值对
- map中的key是唯一的,并且不能修改
- 默认按照小于的方式对key进行比较
- map中的元素如果用迭代器去遍历,可以得到一个有序的序列
- map底层为红黑树,查找效率较高为以2为底n的对数
- 支持[]操作符,operator[]在实际中进行查找操作
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享标题:【C++】关联式容器-map和set-创新互联
地址分享:http://azwzsj.com/article/dcjshp.html