为什么用到10多个容器的时候,容器操作就失效了?

conterc 2009-09-21 07:43:00
因为有大量的小数据要保存,删除,所以就想到了用容器,只是这次用的多点,定义了16个vector<int>变量,到最后发现容器操作全部失效了,一旦程序运行到了容器操作,容器的元素就乱了.
这是怎么回事, 好像没有哪讲到容器的数量限制呀.
...全文
90 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
WuXinyang 2009-09-21
  • 打赏
  • 举报
回复
用错了吧
rendao0563 2009-09-21
  • 打赏
  • 举报
回复

vector<int> vecData;
vecData.push_back(0);
vecData.push_back(1);
vecData.push_back(2);
vector<int> it = vecData.begin();

for(;it!=vecData.end();)
{
//删除等于0的元素
if (*it == 0)
{
it = vecData.erase(it);
}
else
{
it++;
}
}



直接删除迭代器会导致迭代器失效. 用上面的办法删除.
如果直接vecData.erase(it); it就失效了.失效了就不能再++了.++会出问题.
正确的做法是it = vecData.erase(it); 其实相当于删除之后再++.但是这个不会失效.
fishion 2009-09-21
  • 打赏
  • 举报
回复
贴一下你使用代码
jyh_baoding 2009-09-21
  • 打赏
  • 举报
回复
+估计是自己逻辑的错误
conterc 2009-09-21
  • 打赏
  • 举报
回复
问题已经解决,是由于新建的模式对话框有内存泄漏.
一个对话框程序,我手动把那个ABOUT对话框类的那几行程序复制,改了下.....有内存泄漏.
现在我用向导添加了一个类,终于正常了......
谢谢大家.
an_bachelor 2009-09-21
  • 打赏
  • 举报
回复
肯定是你用错了啊 没有这个限制 要限制也不会限制这么小 否则就没法用了
把代码贴出来看看
conterc 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 aaronwang81 的回复:]
erase后,it已经无效了,必须break出循环,否则,肯定出错
[/Quote]

我没用erase呀,6楼才是我的代码...
龙凤呈祥焱 2009-09-21
  • 打赏
  • 举报
回复
erase后,it已经无效了,必须break出循环,否则,肯定出错
conterc 2009-09-21
  • 打赏
  • 举报
回复
vector<char> fir, sec, thd;
char换成int,没改过来,原来以为是增长问题,换成char依然不行,没换过来.
conterc 2009-09-21
  • 打赏
  • 举报
回复
代码如下:

vector<char> fir, sec, thd;
for (i = IDC_CHECK1, j = 0; i <= IDC_CHECK10; ++i, ++j)
{
if(((CButton*)GetDlgItem(i))->GetCheck() == BST_CHECKED)
{
fir.push_back(j);
}
}

if (fir.empty() == TRUE)
{
for (j = 0; j < 10; ++j)
{
fir.push_back(j);
}
}

for (i = IDC_CHECK11, j = 0; i <= IDC_CHECK20; ++i, ++j)
{
if (((CButton *)GetDlgItem(i))->GetCheck() == BST_CHECKED)
{
sec.push_back(j);
}
}

if (sec.empty() == TRUE)
{
for (j = 0; j < 10; ++j)
{
sec.push_back(j);
}
}


for (i = IDC_CHECK21, j = 0; i <= IDC_CHECK30; ++i, ++j)
{
if (((CButton *)GetDlgItem(i))->GetCheck() == BST_CHECKED)
{
thd.push_back(j);
}
}

if (thd.empty() == TRUE)
{
for (j = 0; j < 10; ++j)
{
thd.push_back(j);
}
}
for (vector<int>::iterator first = fir.begin(); first != fir.end(); ++first)
{
for(vector<int>::iterator second = sec.begin(); second != sec.end(); ++second)
{
for (vector<int>::iterator third = thd.begin(); third != thd.end(); ++third)
{
_itoa_s(*first * 100 + *second * 10 + *third, Buffer, 10);
//StrResult += *Buffer;
//StrResult += " ";
}
}
}


还有13个容器变量是和这三个一样的操作,当运行到for的时候容器内的元素就乱了,从调试窗口看的

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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