例如:如果我使用引用矢量元素的变量,则矢量的功能发生了变化,那么我的引用将变为无效引用。
git checkout master
有什么办法可以避免这种情况?还是只是不引用向量元素?
答案 0 :(得分:3)
如果将对象以std :: unique_ptr或std :: shared_ptr的形式存储在向量中,则可以使用std :: unique_ptr :: get()获得指向基础对象的观察指针(如果取消引用智能对象则为引用)指针)。这样,即使智能指针的存储位置在调整大小后发生变化,观察指针也指向同一对象。
#include <memory>
#include <vector>
#include <iostream>
int main() {
std::vector<std::unique_ptr<std::string>> v;
std::unique_ptr<std::string> s = std::make_unique<std::string>("Hello");
//Use either a reference or a pointer
const std::string* obs_pointer = s.get();
const std::string& ref = *s;
v.push_back(std::move(s));
v.reserve(256);
std::cout << ref;
std::cout << *obs_pointer;
}
答案 1 :(得分:2)
健壮且最小的解决方案是存储索引,而不使用指针或引用。
您可以将索引抽象为一个类型。
遵循这些原则(为清晰起见,非模板):
#include <vector>
#include <iostream>
class vector_ref
{
public:
vector_ref(std::vector<int>& v, size_t ix) : m_v(v), m_ix(ix) {}
operator int& () { return m_v[m_ix]; }
int operator=(int x) { m_v[m_ix] = x; return x; }
private:
std::vector<int>& m_v;
size_t m_ix;
};
void foo(int& v) { v = 999; }
int main() {
std::vector<int> v = {1, 2, 3};
vector_ref r(v, 0);
std::cout << r << std::endl;
v.reserve(256);
std::cout << r << std::endl;
r = 21;
std::cout << v[0] << std::endl;
foo(r);
std::cout << v[0] << std::endl;
}