在std ::设置中存储一个指针的指针是安全的吗?
Is it safe to store a pointer to an item in an std::set?
是否可以将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也是安全的吗?
是的,在这方面,set
和unordered_set
都是安全的。如果参考文献没有无效,您的指针也保持有效。
这是基于节点的集合的简单属性;与vector
不同,他们无需在内存中移动值。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 引用一个已擦除类型(void*)的指针
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将指针从一个void函数传递到另一个C++
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 不明白迭代器,引用和指针失效,一个例子
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 将指针分配给另一个指针时会发生什么情况?
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++将一个指针分配给另一个指针时执行的类型检查
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 取消引用结束指针到数组类型的一个
- 更改一个指针后更改乘法对象
- const和指针(一个节点示例)
- 从函数返回指针.一个指针的值未更新