C++ 容器的容器是一个糟糕的设计吗?

C++ 容器的容器是一个糟糕的设计吗?,c++,containers,C++,Containers,我需要一个容器的容器,如: class Widget { ... }; ... std::vector<std::list<Widget> > widgets; 类小部件{ ... }; ... std::向量小部件; 因为STL容器复制其中的对象,并且复制一个容器不是一个便宜的操作,我认为这个容器的容器可能会导致非常糟糕的效率,因此是一个糟糕的设计。 我想知道我是否是对的。如果是,我应该使用容器指针容器还是其他什么? 谢谢 附笔 谢谢你们,现在我知道这是不是一个

我需要一个容器的容器,如:

class Widget {
  ...
};
...
std::vector<std::list<Widget> > widgets;
类小部件{
...
};
...
std::向量小部件;
因为STL容器复制其中的对象,并且复制一个容器不是一个便宜的操作,我认为这个容器的容器可能会导致非常糟糕的效率,因此是一个糟糕的设计。 我想知道我是否是对的。如果是,我应该使用容器指针容器还是其他什么? 谢谢

附笔 谢谢你们,现在我知道这是不是一个坏的设计取决于我如何使用它

因此,如果我知道有多少
列表(最多)将被插入
向量
,然后使用
向量::保留
,以避免
向量
重新分配,然后我只查询其中的对象,这可能是一个很好的设计

另一方面,如果我需要不时地将
列表
插入
向量
,这可能会导致非常糟糕的效率

我说得对吗?

不,为什么

正确使用它们不会成为瓶颈,就像一个简单的STL容器一样

如果使用不当(从设计角度来看),它们当然会照你说的去做,而且效率极低


对于您的特定问题,您可能希望将指针而不是对象存储为数据。

我认为,您的设计问题的答案主要取决于您的项目的特殊性,而我们看不到这些特殊性。您需要存储值(并管理小部件的生命周期)还是只存储引用


请注意,std::vector仅在复制向量时复制元素。否则,当您只需要增加向量容量时,它将使用通常便宜的元素移动构造函数

设计不错。你使用它的方式可能是糟糕的设计。如果您的代码需要频繁的深度复制,并且您实现了
std::vector小部件
,但仍然需要深度复制,那么与您所做的没有多大区别

例如,如果您非常频繁地查询向量中
列表
s的某个成员,这实际上可能是一个很好的设计,因为向量的紧凑性导致内存接近


具有移动语义的支持C++11的现代编译器通常会移动数据,而不是复制数据。因此,我不会太担心病媒迁移或转移“移动”仍然可以由较旧的编译器使用
std::swap来完成,只要它比复制更有意义。

我还认为指针是一种解决方案。但在指针方面,总有一些危险,比如内存泄漏。无论如何谢谢你。很抱歉没有发布我的项目,因为有太多的线。我有这个问题,因为我的
std::list
存储值,并且可能很大。因此,我认为当我将一个新的
列表
插入
向量
并导致
向量
展开时,会重新分配其中的所有对象,这将导致非常糟糕的效率谢谢。事实上,我担心效率,不是因为我可能会深度复制对象,而是因为STL可能会像重新分配
vector
中的
list
s一样执行此操作。@kk模式重新分配中的深度复制是重新分配列表向量的主要瓶颈。这是C++11进行优化的地方之一,因为它只是将内容移到一个新的缓冲区,而不是复制它们,有效地将容量增长操作减少到N个浅拷贝和一个缓冲区alloc。对于较旧的编译器,如果每个元素都交换而不是复制,则取决于实现。