常量引用std::vector
Constant reference std::vector
如何在std::vector中有对特定元素的引用?
简单的方法应该是将其存储为元素的索引(我使用size_t变量)。
我遇到的问题是在当前元素之前插入一个元素的可能性,使存储的值不正确。
没有一种很好的方法可以通过指针、引用或索引来跟踪vector
中的单个元素。特别是:
-
如果在
vector
中插入一个新元素,如果发生内部重新分配,可能会导致对vector
元素的所有未完成的引用无效。插入可以通过调用insert
、reserve
、push_back
或assign
(可能还有其他几个)来实现。这可能导致引用引用一个无效的对象,如果使用引用,将导致未定义的行为。 -
如果你从
vector
中删除一个元素,那么引用可能不再指向同一个元素。访问引用可能导致您引用错误的对象。
如果您确实必须在vector
中保存对元素的引用,一种选择是让vector
存储指向对象的(智能)指针,而不是对象本身。这样,您就可以在其他地方存储该指针的副本,并且无论vector
中发生了什么,该指针都应该仍然有效。在实践中,这确实是软件工程的基本定理——添加另一层间接可以解决大多数问题。
唯一可靠的解决方案是让你的向量是指针的向量,并且只记住你的指针。
否则不能维护引用,因为正如前面提到的,vector可能会移动元素。
使用包含自动指针的向量,如果使用c++0x,即std::vector<std::unique_ptr<YOUR_ELEMENT_TYPE>>
。
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g