C++ map用法

 由于map和其他STL中有相同性,因此可以用在其他的容器中

由于习惯原因下文中将通常说的Keys说成“搜索项”

寻找在map中的当前值的函数


.find()函数

// map::find
#include <iostream>
#include <map>
using namespace std;
int main ()
{
  std::map<char,int> mymap;
  std::map<char,int>::iterator it;

  mymap['a']=50;
  mymap['b']=100;
  mymap['c']=150;
  mymap['d']=200;

cout<<mymap.find('b')->second<<endl ;
cout<<mymap.find('f')->first<<' '<<mymap.find('f')->second<<endl;//如果没有则返回的是一个未知的字符和地址,也就是不确定的
if(mymap.find('f')->first=='f')
cout<<' '<<mymap.find('f')->second<<endl;
return 0;
}

 


寻找map变量的起始地址

.begin()

(map中最基本的函数)

注意begin()函数是始终指向开始的即使是删掉第一个值(详见erase())

// map::begin/end
#include <iostream>
#include <map>

int main ()
{
  std::map<char,int> mymap;
  std::map<char,int>::iterator it;

  mymap['b'] = 100;
  mymap['a'] = 200;
  mymap['c'] = 300;

  // show content:
  std::map<char,int>::iterator it;
  for (it=mymap.begin(); it!=mymap.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';
  return 0;
}



 

清空map所有变量函数

clear()

清空所有的序列,长度变为0

<em>#include <iostream>
#include <map>
using namespace std;
int main ()
{
  std::map<char,int> mymap;

  mymap['x']=100;
  mymap['y']=200;
  mymap['z']=300;
mymap.clear();
cout<<mymap.size()<<endl;
return 0;
}

</em>


运行结果:

0

 

查找在map变量中是否存在当前值

count()

由于在map中所有的索引项都不存在重复的现象,所以此函数只能返回1(能查找到)和0(未查找到)
此函数和find()的区别;因为find返回的可以是找到的索引项,也可以是索引项所含的数据,但是
在count中不可以这样用

//map::count
#include <iostream>
#include <map>
using namespace std;
int main ()
{
  std::map<char,int> mymap;
  char c;

  mymap ['a']=101;
  mymap ['c']=202;
  mymap ['f']=303;

  for (c='a'; c<'h'; c++)
  {
      cout << c;
    if (mymap.count(c)>0)
      cout << " is an element of mymap.\n";
    else
      cout << " is not an element of mymap.\n";
  }

  return 0;
}


运行结果:

a is an element of mymap.
b is not an element of mymap.
c is an element of mymap.
d is not an element of mymap.
e is not an element of mymap.
f is an element of mymap.
g is not an element of mymap.


 

 

查找reverse倒置排序后的首地址函数

rbegin()

返回的是在revese中的首地址

// map::rbegin/rend
#include <iostream>
#include <map>

int main ()
{
  std::map<char,int> mymap;

  mymap['x'] = 100;
  mymap['y'] = 200;
  mymap['z'] = 300;

  // show content:
  std::map<char,int>::reverse_iterator rit;
  for (rit=mymap.rbegin(); rit!=mymap.rend(); ++rit)
    std::cout << rit->first << " => " << rit->second << '\n';

  return 0;
}


运行结果:

z => 300
y => 200
x => 100

 

判断map变量是否为空函数

.empty() 返回的是该map是否为空,空返回1;否则返回0

// map::empty
#include <iostream>
#include <map>
using namespace std;
int main ()
{
  std::map<char,int> mymap;

  mymap['a']=10;
  mymap['b']=20;
  mymap['c']=30;

  while (!mymap.empty())
  {
    std::cout << mymap.begin()->first << " => " << mymap.begin()->second << '\n';
    mymap.erase(mymap.begin());
  }
  cout<<mymap.size();//长度变为零
  return 0;
}

运行结果:

a => 10
b => 20
c => 30
0

查找结束位置函数

end()

// map::begin/end
#include <iostream>
#include <map>

int main ()
{
  std::map<char,int> mymap;

  mymap['b'] = 100;
  mymap['a'] = 200;
  mymap['c'] = 300;

  // show content:
  for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';

  return 0;
}

运行结果:

a => 200
b => 100
c => 300

erase()

擦除的可以是一个元素,也可以是一个范围

// erasing from map
#include <iostream>
#include <map>
using namespace std;
int main ()
{
  std::map<char,int> mymap;
  std::map<char,int>::iterator it;

  // insert some values:
  mymap['a']=10;
  mymap['b']=20;
  mymap['c']=30;
  mymap['d']=40;
  mymap['e']=50;
  mymap['f']=60;

  it=mymap.find('b');
  mymap.erase (it);                   // erasing by iterator

  mymap.erase ('c');                  // erasing by key

  it=mymap.find ('e');
  mymap.erase ( it, mymap.end() );    // erasing by range

  // show content:
  for (it=mymap.begin(); it!=mymap.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';
  cout<<mymap.size();//仅剩下a和d所在的两个数了
  return 0;
}

运行结果:
a => 10
d => 40
2

插入函数

insert()

函数

#include <iostream>
#include <map>
using namespace std;
int main ()
{
   map<char,int> mymap;

  // 第一种插入方式(只插入单个值)                                                                                                                 mymap.insert ( pair<char,int>('a',100) );
  mymap.insert ( pair<char,int>('z',200) );
 
   
//下面是用来显示insert函数的返回值和插入成功与否的判断  
//如果只是研究插入方法的话,此段可以不研究   
pair< map<char,int>::iterator,bool > ret;//此处是设置insert的返回类型  
ret = mymap.insert (  pair<char,int>('z',500) );//可以将该处的'z'修改成'x',观察当插入成功时候的返回值 
if (ret.second==false)//如果是已经存在的就返回0 
{    
 cout << "element '"<<ret.first->first<<"' already existed";  
 cout << " with a value of " << ret.first->second << '\n';  
}   
else  
{     
 cout << "element '"<<ret.first->first<<"' creat successfully";  
 cout << " with a value of " << ret.first->second << '\n';   
}


  // 第二种插入方式 (插入到指定位置):
   map<char,int>::iterator it = mymap.begin();
  mymap.insert (it,  pair<char,int>('b',300));  // max efficiency inserting
  mymap.insert (it,  pair<char,int>('c',400));  // no max efficiency inserting
  // 第三种插入方式(插入一定范围的数值)                                                                                                         map<char,int> anothermap;
  anothermap.insert(mymap.begin(),mymap.find('c'));//mymap.find('c')插入的末地址,但是插入时不包括改地址
 
//第四种插入方式(插入单个值)
  mymap.insert(map<char,int>::value_type('x',20000000));
//第五种 (不是经常用的插入方式)(只插入单个值)
      mymap['f']=100000000; 
  // showing contents:
   cout << "mymap contains:\n";
  for (it=mymap.begin(); it!=mymap.end(); ++it)
     cout << it->first << " => " << it->second << '\n';

   cout << "anothermap contains:\n";
  for (it=anothermap.begin(); it!=anothermap.end(); ++it)
     cout << it->first << " => " << it->second << '\n';

  return 0;
}



 

运行结果:

element 'z' already existed with a value of 200
mymap contains:
a => 100
b => 300
c => 400
f => 100000000
x => 20000000
z => 200
anothermap contains:
a => 100
b => 300

 

 

测试map长度的函数

size()

运行结果:

// map::size
#include <iostream>
#include <map>

int main ()
{
  std::map<char,int> mymap;
  mymap['a']=101;
  mymap['b']=202;
  mymap['c']=302;

  std::cout << "mymap.size() is " << mymap.size() << '\n';

  return 0;
}


 

3

 

 

max_size()

// map::max_size
#include <iostream>
#include <map>

int main ()
{
  int i;
  std::map<int,int> mymap;

  if (mymap.max_size()>1000)
  {
    for (i=0; i<1000; i++) mymap[i]=0;
    std::cout << "The map contains 1000 elements.\n";
  }
  else std::cout << "The map could not hold 1000 elements.\n";

  return 0;
}


 

 

附加map的特点:

入过出现在容器map中不存在的索引项,则自动生成一个新的空间

// accessing mapped values
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main ()
{
  map<char,string> mymap;

  mymap['a']="an element";
  mymap['b']="another element";
  mymap['c']=mymap['b'];
  cout << "mymap now contains " << mymap.size() << " elements.\n";
  cout << "mymap['a'] is " << mymap['a'] << '\n';cout << "mymap['b'] is " << mymap['b'] << '\n';
  cout << "mymap['c'] is " << mymap['c'] << '\n';
  cout << "mymap['d'] is " << mymap['d'] << '\n';//注意本行输出结果与find找不到时的返回值的不同这个返回的是空字符串
  cout << "mymap now contains " << mymap.size() << " elements.\n";
  if(mymap['d']=="\0")         //返回的是空字符串
    cout<<"This is an empty string";
  return 0;
}

未完待续

 参考网站:http://www.cplusplus.com/reference/map/map/max_size/

 

 

 

 

 

 

 

<think>好的,我现在需要帮助用户了解C++map的使用方法,包括教程、示例和语法。首先,我应该回顾用户提供的引用内容,看看有哪些相关的信息可以利用。 用户提供了五个引用,其中引用1到4都是具体的代码示例,展示了map的初始化、插入、交换等操作,引用5提到了map的构造函数、大小和交换、插入删除、查找统计、排序等内容。这些资料应该能覆盖大部分map的基本用法。 首先,我需要整理map的基本概念和特点,比如关联容器、键值对、自动排序这些特性。然后按照构造函数、插入元素、访问元素、大小操作、交换、删除元素、查找统计、排序等模块来组织内容,每个部分配合相应的示例代码。 需要注意的是,用户特别指出要使用中文回答,并且所有的行内数学表达式要用$...$,不过这里可能更多涉及代码而非数学公式,所以可能用不上。但独立代码块需要用```python这样的格式,不过这里应该是C++代码,所以需要调整。 另外,用户要求生成相关问题,放在最后。可能的问题包括map的底层实现、性能分析、如何自定义排序规则,以及与其他容器的比较等。 现在开始组织内容: 1. 概念和特点:根据引用5,map是关联容器,存储键值对,键唯一,自动排序。特点包括有序性、唯一键、高效查找。 2. 构造函数和初始化:引用1、4、5中的示例展示了不同的初始化方式,比如直接初始化、使用insert函数C++11的统一初始化语法。需要将这些例子整理出来,说明不同的构造方法。 3. 插入元素:引用2中的insert函数示例,还可以补充使用下标操作符插入,比如m[key] = value的方式。注意insert的返回值,是否成功插入。 4. 访问元素:使用[]操作符和at()方法,注意区别,比如当键不存在时,[]会插入默认值,而at()会抛出异常。 5. 大小和容量:引用1中的size()函数示例,empty()判断是否为空。 6. 交换:引用3中的swap函数,交换两个map的内容。 7. 删除元素:erase()方法,可以删除迭代器指向的位置、键对应的元素,或者范围。 8. 查找和统计:find()函数返回迭代器,count()统计键出现的次数(0或1)。 9. 排序:map默认按键升序排列,如果需要降序,可以通过指定比较函数,比如使用greater作为模板参数。 在每个部分添加对应的代码示例,例如构造函数部分引用4的示例,插入部分引用2的代码,交换部分引用3的例子,大小部分引用1的代码。 然后需要确保所有代码示例使用正确的格式,比如C++代码块应该用```cpp而不是python。同时,按照用户的要求,回答结构要清晰,分步骤讲解。 最后生成相关问题,比如底层实现、性能、自定义排序、比较等。 需要检查是否有遗漏的部分,比如迭代器的使用、元素的遍历,这些在引用2、3的示例中都有体现,遍历时使用begin()和end(),以及基于范围的for循环。 可能还需要提到map的复杂度,比如插入、删除、查找操作的时间复杂度是O(log n),因为是通常用红黑树实现的。 现在将这些内容整合成一个结构清晰的教程,分点说明,每个部分配合代码示例,并正确引用提供的参考资料。</think>### C++ map 使用教程 #### 一、map 容器基本概念 1. **概念** `std::map` 是 C++ 标准模板库(STL)中的关联容器,存储键值对(key-value)。每个键唯一,且按键自动排序[^5]。 2. **特点** - 键唯一且有序(默认升序) - 基于红黑树实现,操作复杂度为 $O(\log n)$ - 支持快速查找、插入和删除 #### 二、构造函数与初始化 1. **默认构造函数** 创建一个空映射: ```cpp std::map<int, std::string> myMap; ``` 2. **初始化列表构造**(C++11+) 直接初始化键值对: ```cpp std::map<int, std::string> myMap{{1, "one"}, {2, "two"}, {3, "three"}}; // [^4] ``` 3. **范围构造** 通过迭代器范围复制元素: ```cpp std::map<int, std::string> m2(m1.begin(), m1.end()); ``` #### 三、插入元素 1. **`insert` 函数** 插入单个或范围键值对: ```cpp std::map<int, std::string> m{{1, "Java"}, {2, "C++"}, {3, "SQL"}}; m.insert({{4, "VB"}, {5, "Oracle"}}); // [^2] ``` 2. **下标操作符** 若键不存在,自动插入默认值: ```cpp m[6] = "Python"; // 插入键6,值"Python" ``` #### 四、访问元素 1. **`[]` 操作符** 通过键访问值(若键不存在会插入默认值): ```cpp std::string value = m[2]; // 返回"C++" ``` 2. **`at()` 方法** 安全访问(键不存在时抛出异常): ```cpp std::string value = m.at(3); // 返回"SQL" ``` #### 五、大小与交换 1. **`size()` 与 `empty()`** 获取元素数量或判断是否为空: ```cpp std::cout << "Size: " << m.size(); // 输出元素数量[^1] if (m.empty()) { /* 处理空映射 */ } ``` 2. **`swap()` 函数** 交换两个映射内容: ```cpp std::map<char, int> m1{{'a',1}, {'b',2}}, m2; m2.swap(m1); // m2获得m1内容,m1变为空[^3] ``` #### 六、删除元素 1. **`erase()` 函数** 删除指定键、迭代器位置或范围: ```cpp m.erase(3); // 删除键为3的元素 auto it = m.find(2); m.erase(it); // 删除迭代器指向的元素 ``` #### 七、查找与统计 1. **`find()` 函数** 返回键的迭代器,未找到则返回 `end()`: ```cpp auto it = m.find(4); if (it != m.end()) { /* 找到元素 */ } ``` 2. **`count()` 函数** 统计键是否存在(返回0或1): ```cpp if (m.count(5) > 0) { /* 键存在 */ } ``` #### 八、自定义排序规则 默认按键升序排列,可通过模板参数修改: ```cpp std::map<int, std::string, std::greater<int>> m{{3, "a"}, {1, "b"}}; // 输出顺序:3->a, 1->b ``` #### 示例代码整合 ```cpp #include <iostream> #include <map> using namespace std; int main() { // 初始化 map<int, string> m{{1, "Java"}, {2, "C++"}, {3, "SQL"}}; m.insert({{4, "VB"}, {5, "Oracle"}}); // 插入元素 // 访问与修改 m[6] = "Python"; cout << "Key 2: " << m.at(2) << endl; // 遍历 for (auto it = m.begin(); it != m.end(); ++it) { cout << it->first << " : " << it->second << endl; } // 删除 m.erase(3); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值