<分区>
是否可以在 std::set 中存储指向元素的指针?
例如采取以下不安全的例子......
std::vector<int> vec;
//add a bunch of items
int* ptr = &vec[10];
//add more items
std::cout << *ptr << std::endl;
在这种情况下,ptr 指向的内存可能已经通过向 vector 添加额外元素导致其重新分配而失效。但是,如果我使用链表而不是 vector ,我相信这会是安全的,因为它不需要重新分配节点。
我想在处理冗余字符串时使用 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 也是安全的?