我的STL入门程序,求指点哪儿错了
print.h文件:
#ifndef PRINT_H
#define PRINT_H 1
//输出一个指定区间中的所有数据(含头不含尾)
template<typename T>
void print(T b, T e)
{
while(b!=e)
cout << *b++;
//if(c!='\n')
cout << endl;
}
#endif
test.cpp文件:
STL 无限级分类 森林
#include <iostream>
using namespace std;
#include <map>
#include <vector>
#include <string>
#include <typeinfo>
typedef unsigned int Uint;
template<typename K, typename V>
ostream& operator<<(ostream& o, const pair<K,V>& p)
{
return o << p.first << " => " << p.second << endl;
}
struct City
{
pair<string, string> cat_name;
pair<string, Uint> parent_id;
public:
pair<string, Uint> id;
City(){}
City(pair<string, Uint> id, pair<string, string> cat_name, pair<string, Uint> parent_id):id(id),cat_name(cat_name),parent_id(parent_id){}
friend ostream& operator<<(ostream& out, const City& city)
{
out << typeid(city).name() << endl;
out << city.id << city.cat_name << city.parent_id;
return out;
}
};
#include "print.h"
int main()
{
pair<string, Uint> id[7];
for(int i = 0; i < 7; i++)
id[i] = make_pair("id",i+1);
pair<string, string> cat_name[7];
cat_name[0] = make_pair("cat_name", "海淀区");
cat_name[1] = make_pair("cat_name", "朝阳区");
cat_name[2] = make_pair("cat_name", "门头沟");
cat_name[3] = make_pair("cat_name", "北京市");
cat_name[4] = make_pair("cat_name", "馆陶县");
cat_name[5] = make_pair("cat_name", "邯郸市");
cat_name[6] = make_pair("cat_name", "河北省");
pair<string, Uint> parent_id[7];
parent_id[0] = make_pair("parent_id", 4);
parent_id[1] = make_pair("parent_id", 4);
parent_id[2] = make_pair("parent_id", 4);
parent_id[3] = make_pair("parent_id", 0);
parent_id[4] = make_pair("parent_id", 6);
parent_id[5] = make_pair("parent_id", 7);
parent_id[6] = make_pair("parent_id", 0);
City cities[7];
map<pair<string, Uint>, City> mc;
for(int i = 0; i < 7; i++)
{
cities[i] = City(id[i], cat_name[i], parent_id[i]);
mc.insert(make_pair(cities[i].id, cities[i]));
}
print(mc.begin(), mc.end());
cout << "-----------" << endl;
//下面这个函数查找指定ID省(城市)的下属城区
vector<City> rec(const map<pair<string, Uint>, City>& mc, Uint id);
vector<City> subCity = rec(mc, 0);
print(subCity.begin(), subCity.end());
return 0;
}
vector<City> rec(const map<pair<string, Uint>, City>& mc, Uint id)
{
static vector<City> list;
while(mc.begin() != mc.end())
{
//cout << *(mc.begin()) << endl;
if(mc.begin()->second.parent_id.second == id)
{
list.push_back(mc.begin()->second);
rec(mc, mc.begin()->first.second);
}
++mc.begin();//自增貌似没执行,插断点调试看不到mc.begin()
}
return list;
}
[解决办法]
你要遍历这个不能用你的那个什么++mc.begin();
因为mc.begin()求的的始终是第一个位置,你++也始终是第二个位置,所以肯定会死循环。
正确的做法是:声明一个迭代器变量 itr = mc.begin();控制条件是 itr!=mc.end();步长是++itr
然后里面用解引用的运算符来获取迭代器指向的内容
其他的就不多说了吧!
[解决办法]
可是 mc.begin() 总是返回相同的位置,即便自增也不能达到遍历的作用,就像这样
for (size_t i = 0; i < 10; i = 0, ++i);