【C++】map容器

这篇具有很好参考价值的文章主要介绍了【C++】map容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

更明确的类型重命名规则using

在C语言中typedef将一个变量提升为一种类型:

	typedef int * p;//p是int*类型

	//int Array[10];//Array是一个可装10个int类型变量的数组。
	typedef int Array[10];//Array是一个可装10个int类型变量的数组的类型
	//Array arr;
	//sizeof(Array)//40

在C++中提供了更明确的类型重命名规则using

上面两种类型重命名可以改成:

using p = int*;
using Array = int[10];

using可以很方便的定义两种类型的集合,如下,将My_Pair的键值对两个类型定义成一个value_type。

template<class _T1, class _T2>
struct My_Pair
{
	using first_type = _T1;
	using second_type = _T2;
	first_type first;
	second_type second;
};

template<class _Key, class _Ty>
class My_Map
{
public:
	using value_type = My_Pair<_Key, _Ty>;
	value_type data;
};

        value_type是两种类型的集合,使用时给两个类型。

My_Map<string, int>simap;

map容器

        map是C++ STL库中的一个关联式容器,其元素是一对键值对(key-value),可通过键查找值。其中,键和值可以是任意类型,但键必须是唯一的。map中的元素按照键的大小自动排序,因此可以快速地查找、插入和删除元素。map是一个非常常用的容器,常用于需要按照键进行查找的场合。

         map的底层是红黑树, 红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。红黑树是一种接近平衡的二叉树。

        map里面存的是pair,pair有first键和second值两个成员。

创建一个map容器

map<string, int> simap;


/*这样写更方便*/
using NAMap = map<string, int>;
NAMap sm;	//创建容器
sm.insert(NAMap::value_type("xiaoming", 20));//插入数据

插入数据

方法一insert

        容器名.insert(map<键类型,值类型>::value_type(键,值));

	// 类型加括号,调用构造函数
	simap.insert(map<string, int>::value_type("xiaoming", 20));
	//map不允许关键码重复
	simap.insert(map<string, int>::value_type("小红", 20));
	simap.insert(map<string, int>::value_type("小华", 20));

方法二operator[]

        输入的数据放到红黑树中,若红黑树有name(name输入重复了),用age替换原有的;没有,建立结点key = name,val = age;

string name;
int age;
while (cin >> name >> age, name != "end")	
{
	simap[name] = age;//重载[]直接赋值
	for (auto& x : simap)//输出数据
	{
		cout << x.first << " " << x.second << endl;
	}	
}

输出map中的数据

方法一:范围for

        auto根据实际值推演出变量类型,const防止值被修改,&引用赋值不构建将亡值更快。

	for (const auto& x : simap)//范围for
	{
		cout << x.first << " " << x.second << endl;
	}

方法二:迭代器iterator输出

        创建map迭代器指向map中第一个值

	map<string, int>::iterator it = simap.begin();

也可以用auto自动识别map的类型创建迭代器auto it = simap.begin();//这样写更方便

for (; it != simap.end(); it++)
{
	cout << it->first << " " << it->second << endl;
}

用键查询值

string name;
while (cin >> name, name != "end")
{
	try
	{
		auto x = simap.at(name);//at()相当于数组下标,但是比[]更安全
		cout << typeid(x).name() << endl;//运行时类型识别RTTI,输出类型
		cout << x << endl;//输出值
	}
	catch (std::out_of_range& e)//捕获超出范围的异常
	{
		cout << e.what() << endl;
	}
}

【C++】map容器文章来源地址https://www.toymoban.com/news/detail-472668.html

到了这里,关于【C++】map容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++命名空间和include C++ #include<string> 和 using std::string

    1、C++中的命名空间namespace_51CTO博客_c++中的命名空间   2、 C++ #includestring 和 using std::string_yang20141109的博客-CSDN博客 //不光要加头文件,和C语言不同 #include utils/Errors.h //还要加using using android::status_t; using android::INVALID_OPERATION; using android::NO_ERROR; using android::BAD_VALUE; 3、c和c++的差

    2023年04月20日
    浏览(49)
  • c++命名空间和include C++ #include<string> 和 using std::string

    1、C++中的命名空间namespace_51CTO博客_c++中的命名空间   2、 C++ #includestring 和 using std::string_yang20141109的博客-CSDN博客 //不光要加头文件,和C语言不同 #include utils/Errors.h //还要加using using android::status_t; using android::INVALID_OPERATION; using android::NO_ERROR; using android::BAD_VALUE; 3、c和c++的差

    2023年04月20日
    浏览(49)
  • C++11 使用using定义别名(替代typedef)::作用域运算符

    typedef  一切合法的变量的定义可以转换为类型   using:    示例如下:      使用 typedef 重定义类型是很方便的,但它也有一些限制,比如,无法重定义一个模板。   现在,在 C++11 中终于出现了可以重定义一个模板的语法。 C的写法/c++写法   using与模板结合:       usin

    2024年02月08日
    浏览(33)
  • C++友元&&命名空间&&数据类型&&内联&&重载&&缺省

    (1)全局函数作为友元 利用友元这个语法,我们可在函数里访问类里面定义的私有成员; 先定义了一个默认构造函数对类里面的成员进行初始化;goodgay是一个全局的函数,我们想要直接打印私有成员变量就会报错,我们只需要把这个全局函数的定义的第一行放到类里面去,

    2024年04月22日
    浏览(43)
  • C++ 类型兼容规则

    类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。 通过公有继承,派生类得到了基类中除构造函数和析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。类型兼容规

    2024年02月14日
    浏览(32)
  • 【C++】map容器

    在C语言中typedef将一个变量提升为一种类型: 在C++中提供了更明确的类型重命名规则using 上面两种类型重命名可以改成: using可以很方便的定义两种类型的集合,如下,将My_Pair的键值对两个类型定义成一个value_type。         value_type是两种类型的集合,使用时给两个类型

    2024年02月08日
    浏览(29)
  • 【C++】map/multimap容器

    2024年02月10日
    浏览(36)
  • <C++> list容器本质|常用接口|自定义排序规则

    ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:C++泛型编程 🔥前言 今天把 list 容器的基本操作、常用接口做一个系统的整理,结合具体案例熟悉自定义内部排序方法的使用。 list 与 vector 是STL中最常用的两个容器,如果对vector

    2024年02月01日
    浏览(47)
  • C++高级编程——STL:list容器、set容器和map容器

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ---------第3阶段-C++核心编程, -----

    2024年01月25日
    浏览(47)
  • C++容器(vector、deque、list、map)

    数组尾部添加或删除元素非常迅速。但在中部或头部就比较费时。 *代码演示:* 取: at在下标越界时会抛出异常,我们能捕获异常进行处理;而[]下标越界会让程序直接终止; 构造函数: cbegin, cend, crbegin, crend返回的是常量迭代器,不能通过迭代器修改vector元素的值。 插入(

    2024年02月02日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包