C++在两个不同的向量中的相同对象
C++ same object in two different vectors
我正在处理一个C++项目,我想知道是否可以将同一个对象存储在两个不同的向量中。我知道如何在C中用指针处理它,所以你对两个表都引用了同一个对象,但我在C++中有点困惑。
如果我创建了一个对象,并将其存储在向量a和向量b中。C++是否复制该对象,或者它在两个向量上都相同,如果我修改了一个,另一个也被修改了?在第二种情况下,存储两次(针对可访问性问题)是否需要更多的位置,或者这不是一个好的处理方法?
谢谢。
Cppreference是检查这类问题的好地方。让我引用链接的相关部分:
void push_back(const T&value);
void push_back(T&&value);
将给定的元素值追加到容器的末尾。
1) 新元素被初始化为值的副本。
2) 值移动到新元素中。
所以,是的,将同一个元素在两个向量中存储两次会导致它被复制两次。如果不想浪费内存,您应该使用std::vector<T*>
。和往常一样,您还应该考虑智能指针(std::shared_ptr
/std::weak_ptr
),而不是裸指针。
它与C非常相似。
如果您拥有的是vector<object>
,那么您将使用不同的对象。
另一方面,vector<object*>
确保您只存储指向对象的指针,然后让多个向量包含同一个或多个对象不是问题。
在C++中使用指针时,您还可以考虑使用std::shared_ptr
和std::weak_ptr
来简化内存管理。
当您将对象插入std::vector
时,会生成它的副本:
Foo a;
std::vector<Foo> vec1;
std::vector<Foo> vec2;
vec1.push_back(a); //copy made
vec2.push_back(b); //copy made
如果您不想要副本,可以使用指针或std::reference_wrapper
(不能使用引用,因为它们不满足容器值类型的限制):
Foo a;
std::vector<Foo*> vec1;
std::vector<std::reference_wrapper<Foo>> vec2;
vec1.push_back(&a); //no copy
vec2.push_back(std::ref(b)); //no copy
当然,现在不需要确保a
的寿命不短于向量的寿命,否则您将处于未定义行为的快速通道上。
您也可以使用std::shared_ptr
,它将确保您的对象在没有更多引用时被销毁:
std::shared_ptr<Foo> a = std::make_shared<Foo>();
std::vector<std::shared_ptr<Foo>> vec1;
std::vector<std::shared_ptr<Foo>> vec2;
vec1.push_back(a); //reference count incremented
vec2.push_back(a); //reference count incremented
我为您举了一个简单的例子:
class SomeObject { public: int a; };
int main()
{
SomeObject some_object;
some_object.a = 1;
//Copies are made
std::vector<SomeObject> foo;
foo.push_back(some_object);
std::vector<SomeObject> bar;
bar.push_back(some_object);
foo.at(0).a = 2;
bar.at(0).a = 3;
std::cout << foo.at(0).a << ' ' << bar.at(0).a;
//Refers to the same object
std::vector<SomeObject*> baz;
baz.push_back(&some_object);
std::vector<SomeObject*> foobar;
foobar.push_back(&some_object);
baz.at(0)->a = 4;
foobar.at(0)->a = 5;
std::cout << ' ' << baz.at(0)->a << ' ' << foobar.at(0)->a;
return 0;
}
输出:
2 3 5 5
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 迭代时从向量和内存中删除对象
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 如何创建从同一类继承的不同对象的向量
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 从多个源构造一个对象,包括一个对象向量
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 将向量对象存储在共享指针投掷错误中
- E0312,C2664尝试将向量对象作为函数参数传递时错误
- 相对于向量对象的两个成员,找到两个向量的相交的有效方法
- 将数据从文件读取到向量对象
- C 向量对象访问
- 向量对象声明后的括号是什么意思
- 2向量对象指向相同的分配内存
- 如何返回向量对象
- 传递单个或向量对象时没有重载函数的实例
- 指向数组和向量对象的指针
- 向量对象库,可以存储其他对象类型的对象
- 如何从另一个向量/对象集构造新的向量/指针集