在 C++ 中创建一个指向另一个元素的向量

Posted

技术标签:

【中文标题】在 C++ 中创建一个指向另一个元素的向量【英文标题】:Create a vector that points to elements in another in C++ 【发布时间】:2018-07-11 19:59:24 【问题描述】:

下午好,

如果不复制它,我似乎无法制作重复的 std::vector。 我需要创建一个指向另一个 std::vector 的向量而不复制每个值

如果我写

vector_1 = vector_0;

在监视窗口中,&vector_1&vector_0 的内存地址完全不同

&vector_1[0]&vector_0[0] 相同,所以我理解这个操作复制了向量。

但是,当我尝试写 &vector_1[0] = &vector_0[0];&vector_1 = &vector_0;

我得到了错误 Error C2106 '=': left operand must be l-value

我也尝试过以这种方式创建向量:

std::vector<float> vector_1(vector_0[0], vector_0.size()); ,但 &vector_1&vector_0&vector_1[0]&vector_0[0] 显示不同的内存地址,所以它似乎再次复制元素。

谢谢,

【问题讨论】:

std::vector 不支持共享状态。事实上,没有任何类型支持将其地址分配给。 @François 没有任何其他课程。 也许你想要一个std::shared_ptr<std::vector<T>> 为什么需要这个?你不能通过/创建对向量的引用来传递它吗? auto & vector_1 = vector_0; 应该可以吗? 【参考方案1】:

如果您需要 y 只是与 x 相同的向量,请将其作为参考:

std::vector<int> x = 1,2,3,4,5;
std::vector<int> & y = x;

assert(std::addressof(x) == std::addressof(y));

如果您需要 y 可重新分配,请将其设为指针:

std::vector<int> x = 1,2,3,4,5;
std::vector<int> * y = &x;

assert(std::addressof(x) == y);

如果您需要y 共享x 的所有权,请将它们都设为std::shared_ptr

auto x = std::make_shared<std::vector<int>>(1,2,3,4,5);
auto y = x;

assert(x.get() == y.get());

如果您需要y 作为自己的向量,但包含对x 中对象的引用,则将y 设为std::vector&lt;std::reference_wrapper&lt;int&gt;&gt;std::vector&lt;int*&gt;

std::vector<int> x = 1,2,3,4,5;
std::vector<std::reference_wrapper<int>> y(x.begin(), x.end());

for(size_t i = 0; i < x.size(); i++)
    assert(std::addressof(x[i]) == std::addressof(y[i].get()));

//OR save pointers...
std::vector<int*> y;
for(int & i : x)
    y.emplace_back(std::addressof(i));

for(size_t i = 0; i < x.size(); i++)
    assert(std::addressof(x[i]) == y[i]);

//OR save iterators...
std::vector<decltype(x.begin())> y;
for(auto it = x.begin(); it != x.end(); it++)
    y.emplace_back(it);

for(size_t i = 0; i < x.size(); i++) 
    assert(std::addressof(x[i]) == std::addressof(*(y[i])));

【讨论】:

【参考方案2】:

您可以创建对向量的引用

std::vector<T> & vector_1 = vector_0;

这样,vector_1 将成为vector_0 的别名,具有相同的地址且所有元素都相同,不会发生复制。


编辑

如果您希望 vector_0vector_1 共享同一向量的所有权,但要成为独立对象,请使用 shared_ptr,如 Xiremas 答案中所述。

【讨论】:

以上是关于在 C++ 中创建一个指向另一个元素的向量的主要内容,如果未能解决你的问题,请参考以下文章

在递归函数 C++ 中创建向量

如何在 C++ 中创建向量的向量图?

在 C++ 中创建 n-tree

在C++的模板类中创建向量

如何在 C++ 中从现有 2D 向量中创建具有特定列的新向量

如何在 C++ 中创建类对象的向量?