STL中map的使用问题,STL高手请进

fengge8ylf 2005-01-25 11:25:50

我怎样判断通过iterator得到的值是否有效。比如:
struct SOCKBUFINFO {
SOCKET socket;
DWORD id;
CStudent student;
};

map<unsigned int , SOCKBUFINFO*>::iterator m_it;
map<unsigned int,SOCKBUFINFO*>m_mapSockBufInfo;
m_it = m_mapSockBufInfo.begin();
CStudent * p = NULL;
p = m_mapSockBufInfo->second;
if(p)
//处理
当m_it对应的值不存在时,p也不为NULL。我怎么判断m_it对应的值是否存在。
...全文
283 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluckyxl 2005-02-03
  • 打赏
  • 举报
回复
我不是已经说过了么
begin() ~~~ end()之间遍历保证有效
我记得map是不能插入相同key值的记录
pair<iterator, bool>->second 可以看是否有效
可以看map原型参考
这样的话可以通过你的key值来find这个记录是否在容器中
来保证正确

要使用多个key 可以考虑multimap
fengge8ylf 2005-02-03
  • 打赏
  • 举报
回复
goodluckyxl 问题是自己怎样保证有效
xiyi168 2005-02-02
  • 打赏
  • 举报
回复
9494,你迟早要死在多线程上的,你有不加锁保护,

你每次就直接取 m_mapSockBufInfo.begin() 符不符合你的要求。
goodluckyxl 2005-02-02
  • 打赏
  • 举报
回复
p = NULL;p = m_it->second;//我再问一次能正确转化么

map 你用来全局维护
读写必须保护上琐
保证其内容完整性

否则两个线程一起操作ERASE INSERT
肯定会出问题
fengge8ylf 2005-02-02
  • 打赏
  • 举报
回复
在一个线程里有个死循环,每循环一次我m_it++,然后判断m_it的值是否为NULL,取出m_mapSockBufInfo中的值,另一个线程条件适合时我会删除m_mapSockBufInfo中的一个元素,还有一个线程就是在m_mapSockBufInfo中增加元素了.
程序运行有时出错.原因就是m_it超出了m_mapSockBufInfo有效范围,即使判断m_it!= m_mapSockBufInfo.end(), 也没有用处,因为m_it超出m_mapSockBufInfo有效范围,m_it很有可能不等于
m_mapSockBufInfo.end(); 但此时m_it对应的元素是无效的,也不为NULL.
goodluckyxl 2005-02-02
  • 打赏
  • 举报
回复
虽然泛形提供迭代++
但是所有结果是否有效靠自己保证
就是说map
在begin到end中的元素个数是有效的对于容器来说

对于你这种情况
我实在不知道说什么
这和指针类似 point 都超出有效范围一样
必须靠自己把握
容器和迭代器的功能很明确不会负责你这个问题

要不就历遍一次,要么FINDmap的KEY 非常高效log2(n)复杂度
起码保证迭代器有效


fengge8ylf 2005-02-02
  • 打赏
  • 举报
回复
p = NULL;p = m_it->second;//我再问一次能正确转化么
是我写错了 呵呵 但问题不是在这里  这一句编译都编译不过

我加锁了  这点常识我还是有的

其实 大家可以做个简单的实现 
SOCKBUFINFO  *p;
m_mapSockBufInfo中只有一个元素 多次调用m_it++,然后p = NULL;p = m_it->second; 还能得到值    p居然不为NULL  这个时候m_it!= m_mapSockBufInfo.end()成立
xiyi168 2005-02-01
  • 打赏
  • 举报
回复
首先 m_it++,最好改成 ++m_it

当然在每次改变m_it时应该检查它的有效性。

你把的代码贴出来吧,你既然不用迭带器来循环还不如用find得到值
cakecai 2005-02-01
  • 打赏
  • 举报
回复
不一定非得用迭代器吧,直接用map的指针试试。
fengge8ylf 2005-02-01
  • 打赏
  • 举报
回复
问题是怎样维护 即使 m_mapSockBufInfo中只有一个元素 我多次调用m_it++,程序依然不出错,p = NULL;p = m_it->second; 还能得到值 p居然不为NULL  我想解决这个问题 我的程序不是用

for( iter = m_mapSockBufInfo.begin(); iter != m_mapSockBufInfo.end(), iter++ ) 一次来进行循环的
bjnw 2005-01-31
  • 打赏
  • 举报
回复
同意楼上:应该是 p = m_it->second
xiyi168 2005-01-31
  • 打赏
  • 举报
回复
老大 p = m_mapSockBufInfo->second; 错了

应该是 p = m_it->second
fengge8ylf 2005-01-31
  • 打赏
  • 举报
回复
TurkeyTangYu(啸傲江湖)没办法判断m_it 是否有效
goodluckyxl 2005-01-31
  • 打赏
  • 举报
回复
m_mapSockBufInfo.find(unsiged int);//通过这个KEY值查找有效记录

或者取数据
判断是否有效了
for( iter = m_mapSockBufInfo.begin(); iter != m_mapSockBufInfo.end(), iter++ )
来取
至于强制转化为你
p = m_mapSockBufInfo->second; //SOCKBUFINFO*类型向CStudent* ,是编译不过的
这个指针是否为有效靠自己判断而不是迭代器的问题了
healer_kx 2005-01-31
  • 打赏
  • 举报
回复
iter != m_mapSockBufInfo.end()

那么这个iter就可以取second. 否则说明你的map也有问题了.

这就足够了!
howler 2005-01-31
  • 打赏
  • 举报
回复
m_it = m_mapSockBufInfo.begin();

加上 :
if(m_it != m_mapSockBufInfo.end())
{
p = m_it ->second();
.....
}
fengge8ylf 2005-01-31
  • 打赏
  • 举报
回复
老大 p = m_mapSockBufInfo->second; 错了

应该是 p = m_it->second
--------------------------------------------
这是我的笔误 我的程序是m_it->second 但是还是不能解决我的问题
fengge8ylf 2005-01-28
  • 打赏
  • 举报
回复
居然没人知道这个问题的答案
TurkeyTangYu 2005-01-28
  • 打赏
  • 举报
回复
if( m_it != m_mapSockBufInfo->end )
{
CStudent * p = NULL;
p = m_mapSockBufInfo->second;
if(p)
{
...
}

}
fengge8ylf 2005-01-26
  • 打赏
  • 举报
回复
oyljerry(☆勇敢的心☆→㊣Project Coding㊣) STL中的MAP没有GetStartPosition
加载更多回复(9)

16,473

社区成员

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

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

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