是否有可能存储一个指向std :: set中的元素的指针?将指针存储在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使其失效重新分配内存。但是,如果我使用链表而不是矢量,我相信这将是安全的,因为它不需要重新分配节点。
我想在处理冗余字符串时使用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也是安全的?
'makeString'对我来说确实很好。 'std :: unordered_set'应该也是一样。 –
如果集合中的字符串被删除,那么您可能遇到的主要问题是无法解析的指针。我建议你寻找一种不同的方法,除非你准备承担所有额外的簿记工作,以确保代码安全或确保没有元素可以被删除。 – andand
@andand额外的簿记可能(取决于上下文)是微不足道的。 –