最近在做XML的解析方面的,要用到std::map,在此转载,以便将来查询便利
1. map中的元素其实就是一个pair.
2. map的键一般不能是指针, 比如int*, char*之类的, 会出错. 常用的就用string了,int也行.
3. map是个无序的容器, 而vector之类是有序的. 所谓有序无序是指放入的元素并不是按一定顺序放进去的, 而是乱序, 随机存放的(被映射后近似随机存放).所以遍历的时候有些效率差别.
4. 判断有没有找到该键的内容可以这样:
std::map::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::iterator iter;
for (iter = m_map.begin(); iter != m_map.end(); iter++)
{
std::string s = iter->second.filename;
}
由于map内容可以相当一个PAIR, 那就简单了, 用iter->second就可以取得值了.
可顺便转个其它的几种用法:
1 头文件
#include
遍历:
#include
#include
int main(){
mapM;
M[1]=2;
M[2]=3;
map::iterator iter;
for (iter = M.begin(); iter != M.end(); iter++)
{
cout<first<<" "<second< }
return 0;
}
通常在使用STL时,除了List和vector,我们还会经常用到Map。
Map使用关键值
_Key来唯一标识每一个成员
_Tp。
STL中的Map声明如下:
template <
class _Key, class _Tp,
class _Compare = less<_Key>,
class _Alloc = allocatorconst _Key, _Tp> > >
class map
{
...
}
其中_Compare是用来对_Tp进行排序用的,以便提高查询效率。
缺省是less<_Key>
原型如下:
template <class _Tp>
struct less : public binary_function<_Tp,_Tp,bool>
{
bool operator()(const _Tp& __x, const _Tp& __y) const
{ return __x < __y; }
};
它是一个
Functor,留给Map排序用。不过平时我们也可以使用它:
例:
std::less MyLess;
bool bRetVal = MyLess(3, 12);
cout << ((bRetVal == true) ? "Less" : "Greater") << endl;
OK,下面就来示范一个:
#include
程序输出:
MyTestMap[2] = No.2
MyTestMap[2] = No.2 After modification
Map contents :
No.1
No.2 After modification
No.3
No.4
No.5
可见Map已经根据less
对各个成员_Tp进行从小到大进行排了序;
同理,若我们不使用less,改而使用greater,则Map将成员从大到小排序。
/****************CMAP用法*********************/
#include "stdafx.h"
#include
using namespace std;
class Point
{
public:
Point()
{
m_x = 0;
m_y = 0;
}
Point(int x, int y)
{
m_x = x;
m_y = y;
}
public:
int m_x;
int m_y;
};
typedef CMap CMapPnt; //请在使用之前定义
int main()
{
Point elem1(1, 100), elem2(2, 200), elem3(3, 300), point;
CMapPnt mp;
// insert 3 elements into map, #1
mp.SetAt("1st", elem1);
mp.SetAt("2nd", elem2);
mp.SetAt("3th", elem3);
// search a point named "2nd" from map #2
mp.Lookup("2nd", point);
printf("2nd: m_x: %d, m_y: %d\n", point.m_x, point.m_y);
// insert a new pair into map #3
Point elem4(4, 400);
mp["4th"] = elem4;
cout<<"count: "< // traverse the entire map #4
size_t index = 0;
const char* pszKey;
POSITION ps = mp.GetStartPosition();
while( ps )
{
mp.GetNextAssoc(ps, pszKey, point);
printf("index: %d, m_x: %d, m_y: %d\n", ++index, point.m_x, point.m_y);
}
return 0;
}
阅读(2333) | 评论(0) | 转发(0) |