将指针存储到std :: set中的项是否安全?

时间:2016-12-24 15:10:05

标签: c++ c++11 stl

是否可以存储指向std :: set内部元素的指针?

例如,采取以下不安全的例子......

std::vector<int> vec;
//add a bunch of items
int* ptr = &vec[10];
//add more items
std::cout << *ptr << std::endl;

在这种情况下,ptr指向的内存可能已经通过向向量添加额外元素而导致其重新分配而无效。但是,如果我使用链表而不是向量,我相信这样做是安全的,因为它不需要重新分配节点。

我想在处理冗余字符串时使用std :: set来节省内存。以下示例是安全的吗?我认为它适用于std :: set但不适用于std :: unordered_set。

const char* makeString(const char* s)
{
  static std::set<std::string> strings_pool;
  return strings_pool.insert(s).first->c_str();
}

如果字符串c不在strings_pool中,则插入它,否则它将返回池中已有字符串的迭代器。在任何一种情况下,我都获得了迭代器的值,并将指针返回给底层的cstring。我认为这是一个安全的操作,但有人可以证实。

在此链接http://en.cppreference.com/w/cpp/container/set/insert,它显示“没有迭代器或引用无效”。我想这意味着我可以做到。

同样在std :: unordered_set的文档中,它说“引用没有失效”。这是否意味着使用std :: unordered_set也是安全的?

1 个答案:

答案 0 :(得分:5)

是的,setunordered_set在这方面都是安全的。如果引用未失效,则指针也仍然有效。

这是基于节点的集合维护的简单属性;与vector不同,他们不需要在内存中移动值。