读书人

小弟我的STL入门程序求指点哪儿错了

发布时间: 2013-08-01 15:23:18 作者: rapoo

我的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文件:

#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;
}

STL 无限级分类 森林
[解决办法]
你要遍历这个不能用你的那个什么++mc.begin();
因为mc.begin()求的的始终是第一个位置,你++也始终是第二个位置,所以肯定会死循环。
正确的做法是:声明一个迭代器变量 itr = mc.begin();控制条件是 itr!=mc.end();步长是++itr
然后里面用解引用的运算符来获取迭代器指向的内容
其他的就不多说了吧!
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

啥问题???

看我的注释那个mc.begin()++貌似不管用
插断点进去看不到它
输出没结果,函数在死循环了

遍历序列是这样的。

for (auto it = mc.begin(), end = mc.end(); it != end; ++it)
{
//cout << *(mc.begin()) << endl;


if(it->second.parent_id.second == id)
{
list.push_back(mc.begin()->second);
rec(mc, mc.begin()->first.second);
}
}


还有那个递归调用,不确定会不会导致无限递归。不过那个是算法问题了,不是程序问题。
auto 要是不认的话,类型换这个 typename map<pair<string, Uint>, City>::const_iterator;


你的这一招管用了,可以告诉我是为什么不??
为什么我能用print(mc.begin(), mc.end());输出城市信息呢
这个函数里也对mc.begin()++这样自增操作了呀

可是 mc.begin() 总是返回相同的位置,即便自增也不能达到遍历的作用,就像这样

for (size_t i = 0; i < 10; i = 0, ++i);

读书人网 >C++

热点推荐