CSDN博客

img awzzz

学用STL::map成功

发表于2003/7/29 8:15:00  1254人阅读

目的:想通过名字对应数据来组织一组数据

分析:根据经验积累知道这样的功能C++有现成的实现(STL::map/不打算用MS的CMap - 不会:-),完全用不着自己写,可惜以前没有学过STL。

开始工作:不怕,用google搜std::map,Y的,搜中文内容就只有2-3十项,还大部分都是重复个没完,我不会用都能看见到处是错误,一个demo都找不着。还是老老实实的搜英文吧,NB,一下找到了SGI的帮助http://www.sgi.com/tech/stl/Map.html,看看就会了一点点皮毛,继续找http://p2p.wrox.com/archive/c_plus_plus_programming/2001-06/27.asp还算比较详细,可以搞定,没问题了。

先写段代码测试一翻:

用std::map<const char*, int>做测试最简单,不过发现初始化时想循环使用const char*似乎不好使,换std::map<std::string, int>来试试,KAO,用VC6就是编译不过(MS的东东如果多遵点标准就好使了),看来是MS的编译器没做好,委屈求全,换std::map<CString, int>,这回是用MS自己东东,当然不能出问题。

凑合算是搞定了,测试代码能够完全按偶的意志执行。。。有谱了

----------------------------------------测试代码---------------------------

// maptest1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <afx.h>

#include <iostream>
//#include <vector>
#include <map>
using namespace std;

class stT
{
public:
 int  _i;
 char _s[10];

public:
 stT(int i = 0)
 {
  memset(this, 0, sizeof(*this));
  _i = i;
 }
};

struct ltstr
{
 bool operator()(const char* s1, const char* s2) const
 {
  //return strcmp(s1, s2) < 0;
  return _stricmp(s1, s2) < 0;
 }
};

void _map_test2()
{
 typedef std::map<CString, stT, ltstr> TEST_MAP;
 typedef TEST_MAP::iterator TEST_IT;

 TEST_MAP mm;
 for (int i = 0; i < 10; i++)
 {
  CString sTmp;
  sTmp.Format("%02d", i);

  stT t(1 + i);
  strcpy(t._s, sTmp);
  mm[sTmp] = t;
  //mm.insert(TEST_MAP::value_type(sTmp, t));
 }
 mm.insert(TEST_MAP::value_type("Aa", stT(11)));
 mm.insert(TEST_MAP::value_type("aa", stT(12)));
 mm.insert(TEST_MAP::value_type("aA", stT(13)));

 int size = mm.size();

 TEST_IT it;
 for (it = mm.begin(); it != mm.end(); it++)
 {
  stT* pt = &it->second;
  //int t = it->second._i;
 }

 it = mm.find("06");
 if (it != mm.end())
 {
  stT* pt = &it->second;
  //int t = it->second;
 }

 it = mm.find("aa");
 if (it != mm.end())
 {
  stT* pt = &it->second;
  //int t = it->second;
 }

 it = mm.find("AA");
 if (it != mm.end())
 {
  stT* pt = &it->second;
  //int t = it->second;
 }
}

void _map_test1()
{
 typedef std::map<CString, int, ltstr> TEST_MAP;
 typedef TEST_MAP::iterator TEST_IT;

 TEST_MAP mm;
 for (int i = 0; i < 10; i++)
 {
  CString sTmp;
  sTmp.Format("%02d", i);

  int t = (1 + i);
  mm[sTmp] = t;
  //mm.insert(TEST_MAP::value_type(sTmp, t));
 }
 mm.insert(TEST_MAP::value_type("Aa", 11));
 mm.insert(TEST_MAP::value_type("aa", 12));
 mm.insert(TEST_MAP::value_type("aA", 13));

 int size = mm.size();

 TEST_IT it;
 for (it = mm.begin(); it != mm.end(); it++)
 {
  int t = it->second;
 }

 it = mm.find("06");
 if (it != mm.end())
 {
  int t = it->second;
 }

 it = mm.find("aa");
 if (it != mm.end())
 {
  int t = it->second;
 }

 it = mm.find("AA");
 if (it != mm.end())
 {
  int t = it->second;
 }
}

int main(int argc, char* argv[])
{
 _map_test2();
 _map_test1();
 return 0;
}

----------------

请熟悉STL的朋友指点如何在MSVC6下使用std::map<std::string, int>

0 0

相关博文

我的热门文章

img
取 消
img