在 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<std::reference_wrapper<int>>
或std::vector<int*>
:
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_0
和 vector_1
共享同一向量的所有权,但要成为独立对象,请使用 shared_ptr
,如 Xiremas 答案中所述。
【讨论】:
以上是关于在 C++ 中创建一个指向另一个元素的向量的主要内容,如果未能解决你的问题,请参考以下文章