2016-12-24 86 views
2

是否有可能存储一个指向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也是安全的?

+0

'makeString'对我来说确实很好。 'std :: unordered_set'应该也是一样。 –

+0

如果集合中的字符串被删除,那么您可能遇到的主要问题是无法解析的指针。我建议你寻找一种不同的方法,除非你准备承担所有额外的簿记工作,以确保代码安全或确保没有元素可以被删除。 – andand

+0

@andand额外的簿记可能(取决于上下文)是微不足道的。 –

回答

4

是的,setunordered_set在这方面是安全的。如果引用没有失效,你的指针也保持有效。

这是基于节点的集合维护的一个简单属性;不像vector,他们不需要在内存中移动数值。

相关问题