C++ STL Map容器用法详解

版权申诉
0 下载量 158 浏览量 更新于2024-10-19 收藏 8KB RAR 举报
资源摘要信息:"在本资源中,我们将详细探讨C++标准模板库(STL)中的Map容器,这个容器是C++中非常重要的一个容器类型,它以键值对(key-value pairs)的形式存储数据,其中键是唯一的,值是与键相关联的数据。Map容器通常用于需要快速查找和排序的场景中。 首先,Map容器在C++中的完整名称是std::map,它是STL中的一个关联容器,属于C++标准库的一部分。Map容器内部使用红黑树(一种自平衡的二叉搜索树)来实现,因此它能够保证在插入、查找和删除操作中均保持对数时间复杂度的性能。 Map容器的基本用法包括如下几个方面: 1. 创建Map对象: 创建Map容器对象非常简单,可以通过不同的构造函数来实现。比如使用默认构造函数创建一个空的Map容器,或者传入两个迭代器作为参数来复制范围内的元素到Map中。 ```cpp std::map<int, std::string> myMap; // 创建一个空的Map容器 std::map<int, std::string> myMap2(myMap.begin(), myMap.end()); // 使用范围构造函数 ``` 2. 插入元素: 向Map容器中插入元素有多种方法,最常用的是使用insert成员函数或者直接使用下标操作符。 ```cpp myMap.insert(std::make_pair(1, "one")); // 使用insert和make_pair插入键值对 myMap[2] = "two"; // 使用下标操作符插入键值对,键为2的值将会是"two" ``` 3. 访问元素: Map容器提供了下标操作符和at方法来访问元素,使用下标操作符时若键不存在则会自动插入新的键值对,而at方法在键不存在时会抛出异常。 ```cpp std::string value = myMap[2]; // 访问键为2的值 std::string valueAt = myMap.at(2); // 同样访问键为2的值,但键不存在时会抛出异常 ``` 4. 删除元素: Map容器提供了erase成员函数来删除元素,可以删除特定的元素,也可以删除指定范围内的元素。 ```cpp myMap.erase(2); // 删除键为2的元素 myMap.erase(myMap.begin(), myMap.find(5)); // 删除从begin到find(5)之间的所有元素 ``` 5. 查找元素: Map容器提供了find成员函数来进行元素查找,它返回一个指向找到的元素的迭代器,如果未找到则返回end迭代器。 ```cpp auto it = myMap.find(1); // 查找键为1的元素 if (it != myMap.end()) { std::cout << "Found: " << it->second << std::endl; } else { std::cout << "Not found" << std::endl; } ``` 6. 迭代遍历: Map容器提供了begin和end成员函数,可以返回指向容器首元素和尾元素之后位置的迭代器,利用这些迭代器可以遍历容器中的所有元素。 ```cpp for(auto it = myMap.begin(); it != myMap.end(); ++it) { std::cout << it->first << " => " << it->second << std::endl; } ``` 7. 自定义比较函数: 在某些情况下,用户可能需要根据特定的规则来比较键值,这时可以通过定义比较函数或者使用functor(函数对象)来实现。 ```cpp struct MyCompare { bool operator()(const int& lhs, const int& rhs) const { return lhs < rhs; } }; std::map<int, std::string, MyCompare> myMap3; ``` 以上是Map容器的一些基本用法和特性。Map容器在实际编程中非常有用,尤其在需要将数据组织为键值对形式的场合,它能够提供高效的查找性能。此外,由于Map容器属于STL,它与其他STL容器一样遵循迭代器失效规则,因此在操作中需要注意迭代器的有效性。学习Map容器是掌握C++编程的一个重要步骤,尤其对那些希望深入理解STL的人来说至关重要。" 描述中提到的Map容器的基本用法对于初学者来说非常有帮助,提供了清晰的入门指导,而标签信息则表明该资源专注于C++的map相关知识点,涵盖了map、STL、C++标准库等多个关键点。文件名称列表中的“Map容器的用法(STL).doc”也进一步指向了文档的中心内容。

给下面代码每一行给上注释并说明这段代码的意思#include "pch.h" #include "FinBudgetSupport.h" #include <map> time_t StringToDateTime(char* str) { tm tm_; int year, month, day, hour, min, sec; afxDump << str << "\n\n\n\n"; sscanf_s(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &min, &sec); tm_.tm_year = year - 1900; tm_.tm_mon = month - 1; tm_.tm_mday = day; tm_.tm_hour = hour; tm_.tm_min = min; tm_.tm_sec = sec; tm_.tm_isdst = -1; time_t t_ = mktime(&tm_); return t_; } CString DateTimeToString(time_t _time) { tm *_tm = new tm(); gmtime_s(_tm ,&_time); CString t_str; t_str.Format(_T("%d-%d-%d %d:%d:%d"), _tm->tm_year+1900, 1+_tm->tm_mon, _tm->tm_mday, _tm->tm_hour , _tm->tm_min, _tm->tm_sec); delete _tm; return t_str; } CString _toCString(double _value) { CString t_str; t_str.Format(_T("%lf"), _value); return t_str; } CString _toCString(int _value) { CString t_str; t_str.Format(_T("%d"), _value); return t_str; } double _toDouble(CString _str) { return _ttof(_str); } char* CStringToCharArray(CString str) { int str_len = WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), NULL, 0, NULL, NULL);//计算字节数 char* CharArray = new char[str_len + 1]; WideCharToMultiByte(CP_ACP, 0, str, str.GetLength(), CharArray, str_len, NULL, NULL); CharArray[str_len] = '\0'; return CharArray; } void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c) { std::string::size_type pos1, pos2; pos2 = s.find(c); pos1 = 0; while (std::string::npos != pos2) { v.push_back(s.substr(pos1, pos2 - pos1)); pos1 = pos2 + c.size(); pos2 = s.find(c, pos1); } if (pos1 != s.length()) v.push_back(s.substr(pos1)); }

2023-06-10 上传