请教关于CList的几个问题

martenyong 2010-10-25 12:08:12
第一次用CList,有几个问题不太了解,来请教一下~

1.用SetAt()这个函数来改变列表中某一位置的成员的值以后,这个位置原来的成员是被删除了呢,还是移位了呢?CList的长度有没有变化呢?
2.用RemoveAt删除CList中的某一成员之后,后面的成员的索引值是自动减少1么?
3.如果需要一边遍历一个CList然后对于符合某一条件的变量进行删除,应该怎么处理呢?

谢谢。
...全文
112 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
coder0621 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
C/C++ code

void Test_Clist()
{
CList <int, int> mTestList;
for(int i=0; i<10; i++)
mTestList.AddTail(i);

POSITION pos = mTestList.GetHeadPosition();
while(pos)
{
int Cell = mTes……
[/Quote]
如果删除的是第一个节点,即mTestList.GetPrev(pos); //pos指向上一个节点 以便GetNext能指向正确的位置。此时pos指向第一个节点,取他的前一个节点会不会有问题?
ouyh12345 2010-10-25
  • 打赏
  • 举报
回复
1、没有删除成员,只是修改了成员的数据
2、应该减少
3、循环,条件是当前索引不大于list的count - 1
快乐鹦鹉 2010-10-25
  • 打赏
  • 举报
回复
1.被覆盖了。长度无变化。
2.会。
3.要看你怎么遍历了。如果是for循环,那么删除一个成员后,循环变量减一,列表数量减一
zgl7903 2010-10-25
  • 打赏
  • 举报
回复

void Test_Clist()
{
CList <int, int> mTestList;
for(int i=0; i<10; i++)
mTestList.AddTail(i);

POSITION pos = mTestList.GetHeadPosition();
while(pos)
{
int Cell = mTestList.GetAt(pos);
TRACE( _T("%d\n"), Cell);
if(Cell == 5) //删除值为5的节点
{
POSITION posDel = pos; //保留当前节点
mTestList.GetPrev(pos); //pos指向上一个节点 以便GetNext能指向正确的位置
mTestList.RemoveAt(posDel); //删除当前节点
}
mTestList.GetNext(pos);//指向下一节点
}
}
martenyong 2010-10-25
  • 打赏
  • 举报
回复
count=VioList1.GetCount();

for(i=0;i<count;i++)
{

pos=VioList1.FindIndex(i);
m_Randrecord=VioList1.GetAt(pos);

if(……) //满足删除条件
{
VioList1.RemoveAt(pos);
count--;
i--;
}
}

请问以上代码可以满足遍历并删除满足条件的记录的功能么,谢谢!
信阳毛尖 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 martenyong 的回复:]
for(i=0;i<count;i++)
{
pos=VioList1.FindIndex(i);
m_Randrecord=VioList1.GetAt(pos);
}

用这样的语句进行遍历(不进行删除,只是简单的遍历)可以么?
[/Quote]

循环之后结果是 返回最后一个元素
快乐鹦鹉 2010-10-25
  • 打赏
  • 举报
回复
应该也可以。但常用的方法是
POSITION pos = VioList1.GetHeadPosition();
while(pos != NULL)
{
m_Randrecord = VioList1.GetNext(pos);
}
快乐鹦鹉 2010-10-25
  • 打赏
  • 举报
回复
应该也可以。但常用的方法是
POSITION pos = VioList1.GetHeadPosition();
while(pos != NULL)
{
m_Randrecord = VioList1.GetNext(pos);
}
martenyong 2010-10-25
  • 打赏
  • 举报
回复
其中
count=VioList1.GetCount();
martenyong 2010-10-25
  • 打赏
  • 举报
回复
for(i=0;i<count;i++)
{
pos=VioList1.FindIndex(i);
m_Randrecord=VioList1.GetAt(pos);
}

用这样的语句进行遍历(不进行删除,只是简单的遍历)可以么?

16,472

社区成员

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

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

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