【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3652|回复: 0

[STL] 手把手教你stl之map

[复制链接]
发表于 2009-3-1 01:54:33 | 显示全部楼层 |阅读模式
1. map中的元素其实就是一个pair.
2. map的键一般不能是指针, 比如int*, char*之类的, 会出错. 常用的就用string了,int也行.
3. map是个无序的容器, 而vector之类是有序的. 所谓有序无序是指放入的元素并不是按一定顺序放进去的, 而是乱序, 随机存放的(被映射后近似随机存放).所以遍历的时候有些效率差别.
4. 判断有没有找到该键的内容可以这样:
std::map<std::string,Record>::const_iterator cIter;
cIter = stdfile.m_map.find(s);
if (cIter == stdfile.m_map.end()) // 没找到就是指向END了  
{
  m_vecMoreFile.push_back(s);
}
如果键的内容是指针的话, 应该用NULL指针也可以判断了.
5. 遍历:
std::map<std::string,Record>::iterator iter;
for (iter = m_map.begin(); iter != m_map.end(); iter++)
{
std::string s = iter->second.filename;
}
由于map内容可以相当一个PAIR, 那就简单了, 用iter->second就可以取得值了.
­
可顺便转个其它的几种用法:
1 头文件
#include <map>
­
2 定义
map<string, int> my_Map;
或者是typedef map<string, int> MY_MAP;
MY_MAP my_Map;
­
3 插入数据
(1) my_Map["a"] = 1;
(2) my_Map.insert(map<string, int>::value_type("b",2));
(3) my_Map.insert(pair<string,int>("c",3));
(4) my_Map.insert(make_pair("d",4));
­
4 查找数据和修改数据
(1) int i = my_Map["a"];
     my_Map["a"] = i;
(2) MY_MAP::iterator my_Itr;
     my_Itr.find("b");
     int j = my_Itr->second;
     my_Itr->second = j;
不过注意,键本身是不能被修改的,除非删除。
­
5 删除数据
(1) my_Map.erase(my_Itr);
(2) my_Map.erase("c");
还是注意,第一种情况在迭代期间是不能被删除的,道理和foreach时不能删除元素一样。
(3) 迭代期间的删除, erase一个iterator后返回当前iterator
for(iter = my_Map.begin(); iter != my_Map.end();)
{
   if (shouldDelete(*iter)) // 函数是说:如果这个东西需要被删除
        iter = my_Maperase(iter);
   else
       ++iter;
}
­
6 迭代数据
    for (my_Itr=my_Map.begin(); my_Itr!=my_Map.end(); ++my_Itr) {}
­
7 其它方法
    my_Map.size() 返回元素数目
    my_Map.empty() 判断是否为空
    my_Map.clear() 清空所有元素
可以直接进行赋值和比较:=, >, >=, <, <=, != 等等
遍历:
#include<iostream>
#include <map>
using namespace std;
int main()
{
   map<int,int>M;
   M[1]=2;
   M[2]=3;
   map<int,int>::iterator iter;
   for (iter = M.begin(); iter != M.end(); iter++)
   {
      cout<<iter->first<<" "<<iter->second<<endl;
    }
    return 0;
}

8 当Key是结构时该如何定义结构
比如 Key是结构MyStruct类型, 此时map可以定义如下:
std::map > _map;
其中Compare 缺省是std::less,这里可以不写,自定义的结构必须实现Compare指定的比较操作,因此自定义结构
MyStruct必须按照如下写法:

struct MyStruct
{
     int key;
    
     bool operator < ( const MyStruct rhs) const
    {
         return key < rhs.key;
    }
};
当然也可以实现全局operator <
bool operator < ( const MyStruct lhs, const MyStruct rhs)
{
     return lhs.key < rhs.key;
}

另外,当Compare 是std::greater时,需要实现 operator >

9 如何实现两个Key的map, 只有两个Key都匹配才命中目标
可以定义结构MyStruct如下:
struct MyStruct
{
     int key1;
     double key2
    
     bool operator < ( const MyStruct rhs) const
    {
         /* 两个key必须都匹配才命中 */
         return ( key1 < rhs.key1 || key2 < rhs.key2 );
    }
};

10 如何实现两个Key的map, 两个Key中任意一个匹配就命中目标
可以定义结构MyStruct如下:
struct MyStruct
{
     int key1;
     double key2
    
     bool operator < ( const MyStruct rhs) const
    {
         /* 两个key任意一个匹配就命中 */
         return ( ( key1 < rhs.key1 || (key1 > rhs.key1 && key2 < rhs.key2 ) ) && ( key2 < rhs.key2 )  );
    }
};

11 如果被存储的T允许重复,可用multimap

12 如果Key本身就是需要被存储的T, 只要将map换成set就好了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-5-21 21:25

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表