c++ - 将指向项目的指针存储在 std::set 中是否安全?

标签 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 指向的内存可能已经通过向 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 也是安全的?

最佳答案

是的,setunordered_set 在这方面都是安全的。如果引用未失效,您的指针也将保持有效。

对于基于节点的集合来说,这是一个易于维护的属性;与 vector 不同,它们不需要在内存中移动值。

关于c++ - 将指向项目的指针存储在 std::set 中是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41314412/

相关文章:

c++ - 如何使用 std::chrono 库设置特定时间?

c++ - 返回具有 const char* 属性的结构

C++ 自定义容器传递 {} 列表

c++ - 在某些谓词下的编译时填充数组

c++ - 如何覆盖 C++ STL 中分配器类中构造方法的默认行为

c++ - 仿函数调用和函数调用的详细区别?

c++ - 函数重载: builtin vs user defined types

c++ - 这种模式的名称是什么?

c++ - 如何使用非平凡的析构函数防止未使用的变量警告

visual-c++ - 为什么VC2012编译器会进入stackoverflow(错误C1063)?