std::map的新插入方式?

lzt20007 2011-05-26 07:24:25
今天写程序时,发现了一个问题,特写此贴。


问题很简单:
void CMapTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
std::map<int,int> test; //test中无数据
int *ptest = NULL;
ptest = &(test[-1]); //执行此句后,再看看test,-1被插入了!
if (NULL != ptest)
{
//结果ptest不为空!
}

//OnOK();
}


ptest = &(test[-1]); //执行此句后,再看看test,-1被插入了!
这到底是为什么?真的可以这样插入?

各位大牛们帮帮我啊。。。
...全文
221 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzt20007 2011-05-27
  • 打赏
  • 举报
回复
奥,明白了!原来是我用错了。。。
但是这种“ptest = &(test[-1])”很容易让人联想到取地址,谁会想到这也是一种插入方式啊!


谢谢,各位老大了!!
Eleven 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lzt20007 的回复:]
我想问一下:
这种插入方式是不是太变态了?那如果我想看一下有没有“-1”这一项,没有的话,再插入“-1”项呢?遇到这种情况怎么办呢?
[/Quote]
map提供了find()函数;

MSDN上的例子:
// cliext_map_find.cpp
// compile with: /clr
#include <cliext/map>

typedef cliext::map<wchar_t, int> Mymap;
int main()
{
Mymap c1;
c1.insert(Mymap::make_value(L'a', 1));
c1.insert(Mymap::make_value(L'b', 2));
c1.insert(Mymap::make_value(L'c', 3));

// display contents " [a 1] [b 2] [c 3]"
for each (Mymap::value_type elem in c1)
System::Console::Write(" [{0} {1}]", elem->first, elem->second);
System::Console::WriteLine();

System::Console::WriteLine("find {0} = {1}",
L'A', c1.find(L'A') != c1.end());

Mymap::iterator it = c1.find(L'b');
System::Console::WriteLine("find {0} = [{1} {2}]",
L'b', it->first, it->second);

System::Console::WriteLine("find {0} = {1}",
L'C', c1.find(L'C') != c1.end());
return (0);
}

lzt20007 2011-05-26
  • 打赏
  • 举报
回复
我想问一下:
这种插入方式是不是太变态了?那如果我想看一下有没有“-1”这一项,没有的话,再插入“-1”项呢?遇到这种情况怎么办呢?
lzt20007 2011-05-26
  • 打赏
  • 举报
回复
你说得对,我之前的value就是自己定义的一个类。改为int型后还是被插进去了。。
呵呵,真是个悲剧啊!!
[Quote=引用 5 楼 visualeleven 的回复:]

test[-1];这里的-1表示key,如果这个可以key在map容器中不存在,就添加一个新元素,并将它插入到此map对象中,所关联的值采用值初始化,类类型的元素采用默认构造函数初始化,而内置类型的元素则初始化为0.
[/Quote]
Eleven 2011-05-26
  • 打赏
  • 举报
回复
test[-1];这里的-1表示key,如果这个可以key在map容器中不存在,就添加一个新元素,并将它插入到此map对象中,所关联的值采用值初始化,类类型的元素采用默认构造函数初始化,而内置类型的元素则初始化为0.
chenjiawei007 2011-05-26
  • 打赏
  • 举报
回复
ptest是地址,地址不是空,但是ptest所指向的内容是 value= test[-1] 为0
chenjiawei007 2011-05-26
  • 打赏
  • 举报
回复
错了
相当于int tt= test[-1];就可以执行插入。
map中如果key值没有,则会默认初始化value
chenjiawei007 2011-05-26
  • 打赏
  • 举报
回复
相当于是test[-1] = *ptest 的插入方式
sxqinge 2011-05-26
  • 打赏
  • 举报
回复
map<int,int>中,第一个int是key值,第二个与之为对应的值。
你的代码中,-1被当成是map的key值了,&test[-1]不就是表示key值为-1的那项么。

16,472

社区成员

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

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

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