当前位置:  开发笔记 > 编程语言 > 正文

std :: map,指向映射键值的指针,这可能吗?

如何解决《std::map,指向映射键值的指针,这可能吗?》经验,为你挑选了2个好方法。

第23.1.2节#8(关联容器要求):

插入成员不应影响迭代器和对容器的引用的有效性,并且擦除成员应仅使迭代器和对已擦除元素的引用无效.

所以保证指向map元素的数据成员的指针保证有效,除非你删除元素.



1> Greg Rogers..:

第23.1.2节#8(关联容器要求):

插入成员不应影响迭代器和对容器的引用的有效性,并且擦除成员应仅使迭代器和对已擦除元素的引用无效.

所以保证指向map元素的数据成员的指针保证有效,除非你删除元素.


是的,格雷格,我们是对的.23.1.2/8:"插入成员不应影响迭代器的有效性和对容器的引用,擦除成员应仅使迭代器和对擦除元素的引用无效." 当然,你得到+1.
仅供注意:该文本已移至新版标准草案中的新部分p.744,23.2.4#9.[N3797,2013-10-13](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf)

2> PierreBdR..:

首先,地图保证稳定; 即迭代器不会因元素插入或删除而失效(当然要删除的元素除外).

但是,迭代器的稳定性并不能保证指针的稳定性!尽管通常会发生大多数实现使用指针 - 至少在某种程度上 - 来实现迭代器(这意味着假设您的解决方案可以正常工作),您应该真正存储的是迭代器本身.

你可以做的是创建一个小对象,如:

struct StringPtrInMap
{
  typedef std::map::iterator iterator;
  StringPtrInMap(iterator i) : it(i) {}
  const string& operator*() const { return it->first; }
  const string* operator->() const { return &it->first; }
  iterator it;
}

然后存储而不是字符串指针.


嗯..只是看着另一个高度赞成的答案.由于std(也)要求*引用*是稳定的,这也意味着指针(不仅是迭代器)也需要稳定.
推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有