如何在标准Windows库下实现类似于MFC中集合的功能?

qqiuzaihui 2010-07-09 12:09:16
我新建了做了一个基于 标准Windows库 的动态库, 想在里面实现类似于MFC中支持的集合的功能.
注意不是基于MFC的, 如果是MFC的, 可以容易实现, 比如下面就是我写的一个实现:
CList< long, long> myList;

// 初始化相关
for(int i=0; i<5; i++)
{
myList.AddTail( i );
}

POSITION pos = myList.GetHeadPosition(); // 获得链表头的位置
//POSITION pos = myList.GetTailPosition(); // 获得链表尾的位置

CString strtemp;
long data;
while(pos != NULL)
{
data = myList.GetNext(pos); // 取得当前pos指向的数据,并pos指向下一个数据
strtemp.Format( L"%d", data );
MessageBox( strtemp );
}
pos = myList.Find( 3 );
myList.RemoveAt( pos );

myList.AddTail( 8 );

pos = myList.GetHeadPosition(); // 获得链表头的位置
while(pos != NULL)
{
data = myList.GetNext(pos); // 取得当前pos指向的数据,并pos指向下一个数据
strtemp.Format( L"%d", data );
MessageBox( strtemp );
}
注意 CList< long, long> 中的参数有可能是根据我的需求而变的, 有可能是 LPCSTR, 也有可能是一个类. 我现在想要的是在纯C++中实现这样功能, 因为我写C++的不多, 对于这个理解的不深, 有哪位高手帮忙指点一下? 最好给我一个完整的示例, 谢谢了.
...全文
220 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakaying 2010-07-09
  • 打赏
  • 举报
回复
看你描述的需求,似乎map更合适。
kakaying 2010-07-09
  • 打赏
  • 举报
回复
从代码里似乎看不太出来,呵呵
MFC的都忘了,我猜你说的应该是set?STL里有std::set。如果不考虑效率的简单实现无非是在List中插入数据前增加查重操作,当然一般都不会这样实现,比如用RB-Tree。
不知道我理解的对不对?
qqiuzaihui 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kakaying 的回复:]

没看明白,楼主这是要做什么?
[/Quote]
这是一个PC机与多部手机通讯的一个实现, 我启用了一个监听, 当有号码拔进来时就把这个号码的相关信息(号码类)添加进这个容器中, 当与号码断开连接时又得把这个号码从容器里面移除. 因为拔进来的号码的数量是不定的, 所以我不能用数组. 我觉得这个跟集合挺类似的, 所以就想实现这样的一个功能.
kakaying 2010-07-09
  • 打赏
  • 举报
回复
没看明白,楼主这是要做什么?
qqiuzaihui 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]

CList既然是模板,它得源码应该可以直接看到得,它自己就是个例子
[/Quote]
问题是CList中的比较复杂, 再加上我的C++功底比较差, 写不出这样的实现.
我想在C++中应该会有类似的实现吧, 请大家帮我想想了, 有没有其它比较折衷的办法?
arong1234 2010-07-09
  • 打赏
  • 举报
回复
CList既然是模板,它得源码应该可以直接看到得,它自己就是个例子
qqiuzaihui 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kakaying 的回复:]

看你描述的需求,似乎map更合适。
[/Quote]
map怎么用?
qqiuzaihui 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cattycat 的回复:]

stl的map可以用,最简单的vector也可以啊。
比如你定义了号码的信息结构体
stuct numInfo
{
int num;
...
};
vector<numInfo> numvec;
查找的话,循环遍历一遍numvcec,看里边的numInfo的num是不是你想找的,删除的话vector的remove方法可以用。
for(vector<numInfo>::Itera……
[/Quote]
谢谢, 我就是用类似的这种方法实现的. 不过我用的是list, 如下:
typedef list<LinkedPhone*> LinkedPhoneList;

LinkedPhoneList m_LinkedPhoneArray;

// 增加
m_LinkedPhoneArray.push_back(pLinkedPhone);

// 移除
LinkedPhone *pLinkedPhone = NULL;
LinkedPhoneList::iterator i;

for ( i = m_LinkedPhoneArray.begin(); i != m_LinkedPhoneArray.end(); i++)
{
pLinkedPhone = *i;
if(pLinkedPhone->m_strComPort == pPhone->GetPortName())
{
delete pLinkedPhone->m_pCom;
delete pLinkedPhone;
m_LinkedPhoneArray.erase( i );
}
}

平时很少使用C++, 看来该好好看看标准c++库了. 谢谢大家.
康斯坦汀 2010-07-09
  • 打赏
  • 举报
回复
#include <vector>
djjlove_2008 2010-07-09
  • 打赏
  • 举报
回复
stl更好。
cattycat 2010-07-09
  • 打赏
  • 举报
回复
stl的map可以用,最简单的vector也可以啊。
比如你定义了号码的信息结构体
stuct numInfo
{
int num;
...
};
vector<numInfo> numvec;
查找的话,循环遍历一遍numvcec,看里边的numInfo的num是不是你想找的,删除的话vector的remove方法可以用。
for(vector<numInfo>::Iterator it=numvec.begin();;i!=numvec.end();++it)
{
if((*it).num==xxx)
it=numvec.erase(it);
}
map的话不举例了。这些都是标准c++库中的,stl的。
fcly1981826ly 2010-07-09
  • 打赏
  • 举报
回复
学习学习
InfidelX 2010-07-09
  • 打赏
  • 举报
回复
晕,要一个标准的C++的集合库么?

64,654

社区成员

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

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