【C++】关联式容器-map和set-创新互联

文章目录
  • 关联式容器
  • 键值对
  • 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;

T:set中存放元素的类型,实际在底层存储的键值对
Compare:set中元素默认按照小于来比较
Alloc:set中元素空间的管理方式,使用STL提供的空间配置器。

set的构造
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的修改操作
函数声明功能
pairinsert ( const value_type& x )在set中插入元素x,实际插入的是构成的键值对,如果插入成功,返回<该元素在set中的位置,true>,如果插入失败,说明x在set中已经存在,返回
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&st)交换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底层通常被实现为红黑树。
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中元素的修改
函数声明功能
pairinsert ( const value_type& x )在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&st)交换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://myzitong.com/article/dcjshp.html