【问题标题】:stl container of vectors of object c++对象c ++的向量的stl容器
【发布时间】: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&lt;std::vector&lt;Whatever&gt;&gt;。内部向量的重新分配不会影响外部向量。
  • @Quentin 怎么样?如果我错了,请纠正我,但向量的元素需要是连续的,不是吗?那么如果任何内部向量需要重新分配,那么外部向量怎么可能不需要呢?
  • 每个单独的向量都需要是连续的。这意味着向量对其自己的连续内存块进行动态分配。因此,外部向量不会在连续内存中包含所有内部向量数据,而是在连续内存中具有内部向量对象。内部向量中的数据存储在每个向量分配的单独块中。

标签: c++ list vector stl containers


【解决方案1】:

您要查找的容器是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&lt;T&gt;std::vector&lt;std::vector&lt;T&gt;&gt; 更好,因为std::vector 的最大优点是它的数据局部性(元素存储在连续的内存中),并且因为std::vector 增加了该数据的间接级别嵌套向量中的局部性丢失(只有内部向量元素存储在连续内存中)。但是,如果您只处理内部向量,那么这可能不是真正的劣势。

【讨论】:

  • 我付出了巨大的努力和不可估量的才能,在stackoverflow.com/a/40499774/451600中说明了向量的向量是如何布局的。
  • @Captain 这确实是一件令人印象深刻的艺术品。有些颜色会很棒,但也许我要求太高了
  • @idclev 463035818 现在一切都清楚了。但我真的不明白你所说的使用模板->“(...)因为大加号(...)”。我知道模板是什么,但你在这里所说的并没有为我点击。除此之外的一切都非常清楚。
  • @Tojmak 我没有说任何关于模板的事情。最后一部分是关于嵌套向量的内存布局。查看第一条评论中的链接以获取更多详细信息。嵌套向量与列表没有什么不同。内部向量的元素连续存储,内部向量也连续存储在外部向量中。但是元素并不直接存储在向量中,例如std::vector&lt;std::vector&lt;T&gt;&gt; x;x[0] 的元素存储在内存中,不一定靠近存储x[1] 元素的内存
  • @idclev 463035818 哦,好吧,对不起,T 误导了我,因为我通常在模板中看到这一点。非常感谢您的帮助。
猜你喜欢
  • 2011-11-10
  • 2011-06-05
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多