改变一个已经压入的列表(在vector对象上)会改变vector对象上的列表吗?
Does changing an already pushed list(on a vector) change the list that is on a vector?
例如,我们有一个列表向量。在for循环中将list i压入vector[0]。然后在循环迭代时,移到vector[1],并给list i赋新值,然后将list i压入vector[1]。在vector[0]上被压入的list I也会改变吗?谢谢你!
不,除非你有一个std::reference_wrapper<std::list>
的向量,即std::list
周围的参考包装器。push_back
复制值(或移动右值)。请注意,您不能有一个纯引用的容器,这就是为什么您需要std::reference_wrapper
,以防您想要"模拟"将引用推回容器。
代码示例如下:
#include <iostream>
#include <list>
#include <functional>
#include <vector>
template<typename T>
void display(T const& container)
{
for (auto && elem : container)
{
for (auto && i : elem)
{
std::cout << i << " ";
}
std::cout << std::endl;
}
}
template<typename T>
void display_ref(T const& container)
{
for (auto && elem : container)
{
for (auto && i : elem.get())
{
std::cout << i << " ";
}
std::cout << std::endl;
}
}
int main()
{
std::vector<std::list<int>> v1;
std::vector<std::reference_wrapper<std::list<int>>> v2;
std::list<int> l{1, 2, 3};
v1.push_back(l);
v2.push_back(l);
// modify l
l.front() = 42;
// display
display(v1); // unchanged
display_ref(v2); // changed
}
Live on Coliru
std::vector保存了你赋给它的元素的值的副本。因此,当您将新值放入您最初分配给向量的外部列表中时,vector[0]
中的列表将不会改变。
相关文章:
- 如何访问和改变存储在矢量C++中的对象
- 通过从构造函数中的'this'复制的指针改变常量对象
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 使用(非对象)API 时改变表数组C++而不重新创建整个平面缓冲区
- 为什么我的函数不改变对象的属性
- 改变对象的原点点使其以不同的轴移动
- 更改指针指向的对象,但对象不会改变
- 对列表中的每个对象调用成员函数,以改变对象所在的列表
- 当函数应该改变对象的状态时,是选择成员函数还是朋友函数
- 一个什么都不做的函数可以改变一个对象吗?
- 改变一个已经压入的列表(在vector对象上)会改变vector对象上的列表吗?
- 如何改变一个c++对象的类(实现可变类型)
- 如果一个引用一旦被初始化为一个对象,它就不能被改变,为什么这样做呢?
- 在c++中,改变指针返回后指向的对象
- 改变数组中的对象,但不改变对象的数量- c++
- 将字符串保存到重载括号中,不改变对象的字段
- 如何用静态方法改变c++中对象的属性
- 为什么每次我试图改变对象时,我的复制构造函数都会产生段错误?
- 改变对象
- 当调用改变它的成员函数时,不改变C对象成员