向量更改功能时,有什么方法可以更新指针/参考值?

时间:2019-10-23 07:43:31

标签: c++

例如:如果我使用引用矢量元素的变量,则矢量的功能发生了变化,那么我的引用将变为无效引用。

git checkout master

有什么办法可以避免这种情况?还是只是不引用向量元素?

2 个答案:

答案 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;
}