【发布时间】:2020-10-15 03:04:47
【问题描述】:
我有一些对象向量的类,还有很多处理这些向量的方法。所以我的伪代码是这样的:
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::vector
另外,如果列表没问题,我需要一些帮助,因为我已经尝试过使用列表:
std::vector<object>& getByIndex(size_t index)
{
return (*std::next(m_container.begin(), index));
}
但它不起作用。使用我从 getByIndex 方法返回的内容作为参数的方法不会向 m_container 添加内容。好像它是按值而不是引用返回的。也许我对从该方法返回的内容犯了错误?我将不胜感激。
【问题讨论】:
-
“每次将新的对象向量添加到我的类时,我都必须记住为所有方法添加新行”是明确的design smell。
-
我在考虑 std::list 因为这些向量正在改变它们的大小,所以有很多重新分配。 即使向量的大小发生变化并不意味着外部向量将需要重新分配。只有当您从外部向量本身添加/删除时才会发生这种情况。
-
只需使用
std::vector<std::vector<Whatever>>。内部向量的重新分配不会影响外部向量。 -
@Quentin 怎么样?如果我错了,请纠正我,但向量的元素需要是连续的,不是吗?那么如果任何内部向量需要重新分配,那么外部向量怎么可能不需要呢?
-
每个单独的向量都需要是连续的。这意味着向量对其自己的连续内存块进行动态分配。因此,外部向量不会在连续内存中包含所有内部向量数据,而是在连续内存中具有内部向量对象。内部向量中的数据存储在每个向量分配的单独块中。
标签: c++ list vector stl containers