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