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

cha*_*255 2 c++ stl c++11

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

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

std::vector<int> vec;
//add a bunch of items
int* ptr = &vec[10];
//add more items
std::cout << *ptr << std::endl;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

同样在std :: unordered_set的文档中,它表示"引用不会失效".这是否意味着使用std :: unordered_set也是安全的?

Ala*_*kes 5

是的,无论是setunordered_set在这方面是安全的.如果引用未失效,则指针也保持有效.

它是基于节点的集合维护的简单属性; 不像vector他们不需要在内存中移动值.