在std ::设置中存储一个指针的指针是安全的吗?

Is it safe to store a pointer to an item in an std::set?

本文关键字:指针 一个 安全 设置 std 存储      更新时间:2023-10-16

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

例如以以下不安全示例...

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

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

我想在处理冗余字符串时使用std ::设置来保存内存。以下示例会安全吗?我认为这是针对STD ::设置的,但不适合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不同,他们无需在内存中移动值。