目的:想通过名字对应数据来组织一组数据
分析:根据经验积累知道这样的功能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>