对象 C++ 向量的 STL 容器

stl container of vectors of object c++

本文关键字:STL 容器 向量 C++ 对象      更新时间:2023-10-16

>我有一些对象向量的类,还有很多处理这些向量的方法。所以我的伪代码看起来像这样:

method1(std::vector1);
method1(std::vector2);
.
.
.
method2(std::vector1);
method2(std::vector2);
.
.
.
(etc.)

每次将新的对象向量添加到我的类中时,我都必须记住为所有方法添加新行。所以我开始考虑可以存储所有这些对象的新容器。我创建了一个带有容器的新类,该容器存储了我所有的对象向量。还有移动到该新类的所有向量。我希望每次需要新向量时都可以向该类添加新向量,并在我的所有方法中遍历所有这些向量,如下所示:

method1()
{
for(auto& temp : container)
{
...
}
} 

在我的新课上,类似的东西:

vector<object>& getByIndex(size_t index) 
{
return container[index]
}

我需要通过引用返回对象的向量,因为我需要对这些对象执行一些操作。 所以... 我问我应该使用什么容器?怎么做呢?也许有更好的解决方案。这只是我想出的想法。我在考虑std::list,因为这些向量正在改变它们的大小,所以有很多重新分配。我不想用 std::vectorstd::vectorstd::vector来扼杀我的性能。

另外,如果列表没问题,我需要一些帮助,因为我已经尝试过列表:

std::vector<object>& getByIndex(size_t index)
{ 
return (*std::next(m_container.begin(), index)); 
}

但它不起作用。使用我从getByIndex方法返回的内容作为其参数的方法不会向m_container添加内容。好像它是通过值而不是引用返回的。也许我对从该方法返回的内容有误?我将不胜感激任何帮助。

您要查找的容器是std::vector

我在考虑std::list,因为这些向量正在改变它们的大小,所以有很多重新分配。

添加元素时,std::vector不会更改其大小。std::vector::size()返回元素数,但sizeof(some_vector)是常数。一个极其简化的std::vector模型应该足以理解原因:

template <typename T>
struct fake_vector {
T* data;
// ... other stuff ...
};

无论data指向包含 10 个元素、42 个元素还是 10000 个元素的数组,矢量对象的大小始终相同。

在一般情况下,给定类型的实例始终具有相同的大小。这就是为什么你可以拥有对象数组的原因。

对于问题的最后一部分,您需要展示一个完整的示例,但是对于向量向量,该方法只需:

std::vector<object>& getByIndex(size_t index)
{ 
return data[index];
}

通常,平面std::vector<T>std::vector<std::vector<T>>更好,因为std::vector的最大优点是其数据局部性(元素存储在连续内存中(,并且由于std::vector增加了间接级别,因此此数据局部性在嵌套向量中丢失(只有内部向量元素存储在连续内存中(。但是,如果您只处理内部向量,那么这可能不是一个真正的缺点。