使用iterator出问题了,求助

飞起来一脚 2010-06-30 03:44:00
自己写了个函数,递归产生目录,写了一个静态函数,把options(目录表)备份成newoptions,然后清空options,在根据newoptions重新按照要求生成"Objects"为根目录的所有目录,但是迭代的时候出了问题,请大家帮忙看看,一天了没找到原因


//调用函数
ZxyFolder::selectObjectsFolder(options,"Objects");

//其中变量如下
typedef std::map<std::string, std::string> response_t;
typedef std::vector<response_t> options_t;
LLUserAuth::options_t options;


//类定义
class ZxyFolder
{

public:
static void selectObjectsFolder(LLUserAuth::options_t &options,std::string objectname)
{
//backup the options as newoptions
//newoptions=options;
LLUserAuth::options_t newoptions(options);
//newoptions.assign(options.begin(),options.end());

//empty the options
options.clear();
//make root
LLUserAuth::options_t::iterator iter;

//出问题的就是这里,未经过一次迭代,单步跟踪发现发现newoptions已经有值了,18个值呢,这里一次也不执行,直接跳出去了,为什么呢?
for(iter=newoptions.begin();iter!=newoptions.end();iter++)
{
if((*iter)["name"]==objectname)
options.push_back((*iter));
break;
}

//iterator
//iterate until the folder id established
//the result is that a new options will be created
hasChildren(0,options,newoptions);
}


static void hasChildren(int ids,LLUserAuth::options_t &options,LLUserAuth::options_t newoptions)
{
if(ids==options.size()) return; //越界,返回
std::string a1=options[ids]["folder_id"];
LLUserAuth::options_t::iterator iter;
for(iter=newoptions.begin();iter!=newoptions.end();iter++)
{
std::string a2=(*iter)["parent_id"];
if(a1==a2)
{
options.push_back(*iter);
ids++;
hasChildren(ids,options,newoptions); //如果有子目录,递归
}
}
return;
}
};
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞起来一脚 2010-06-30
  • 打赏
  • 举报
回复
补充一下
我在其他类(设c1类,此出给出options的定义,即LLUserAuth::options_t options;
)中调用的其他方法(m1)(肯定是正确的方法)修改options(形参&options),修改完毕,在方法体内跟踪,options被赋值成功。

执行完毕,程序出了m1方法,返回c1类,单步跟踪又看不到options的值

继续执行,到下一个方法(m2),当再次把option传入(形参&options)的时候进行修改,修改前发现刚才修改的值还保存着。

使用vs2005调试

所以,单步跟踪时,我在c1中看不到options的值是因为此时options是一个指针吗?而在m1,m2方法中能看到因为传入的是实际值(&options)?
yuxiabo1984 2010-06-30
  • 打赏
  • 举报
回复
同意一楼的
lvshaoqing 2010-06-30
  • 打赏
  • 举报
回复
c++之复杂,其是一两本教科书所能概括。 所以,你自学的话是学不好的,不要学c++了,去学java吧。
飞起来一脚 2010-06-30
  • 打赏
  • 举报
回复
我也觉得应该是有值啊,我用newoptions.size()输出,也显示有18个值,但是每次iterator的时候都是直接跳出,根本不进入循环体内部
pengzhixi 2010-06-30
  • 打赏
  • 举报
回复
LLUserAuth::options_t newoptions(options);//如果你的options有值那么newoptions就有值
kingstarer 2010-06-30
  • 打赏
  • 举报
回复
for(iter=newoptions.begin();iter!=newoptions.end();iter++)
{
if((*iter)["name"]==objectname)
options.push_back((*iter));
break;
}


执行了一次直接break了 应该是if忘了加括号

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧