什么是C#Collection <t>的C ++等价物以及如何使用它?</t>

时间:2009-12-06 17:44:54

标签: c++ stl

我需要在C ++中存储一个动态创建的特定基类型对象的列表/集合/数组(我是C ++的新手)。在C#中我会使用泛型集合,我在C ++中使用什么?

我知道我可以使用数组:

SomeBase* _anArrayOfBase = new SomeBase[max];

但是我没有得到任何“免费”的东西 - 换句话说,我不能迭代它,它不会自动扩展等等。

那么还有其他选择吗?

由于

7 个答案:

答案 0 :(得分:17)

std::vector是数组的包装器,但它可以扩展并自动执行。但是,这是一项非常昂贵的操作,因此如果您要进行大量的插入或删除操作,请不要使用矢量。 (您可以使用保留功能,以保留一定的空间)

std::list是一个链表,它的插入和删除时间要快得多,但迭代速度较慢,因为值没有存储在连续的内存中,这意味着地址计算要复杂得多,你不能迭代列表时利用处理器缓存 与向量或双端队列相比,主要的好处是可以相当便宜地从列表中的任何位置添加或删除元素。

作为妥协,有std::deque,其外部以与矢量类似的方式工作,但在内部它们是非常不同的。 deque的存储不必是连续的,因此它可以分成块,这意味着当deque增长时,它不必为其整个内容重新分配存储空间。访问速度稍慢,您无法使用指针算法来获取元素。

答案 1 :(得分:9)

你应该使用矢量。

#include <vector>

int main()
{
  std::vector<SomeBase*> baseVector;
  baseVector.push_back(new SomeBase());
}

C ++包含STL中的一组数据容器。 请查看here

答案 2 :(得分:4)

您应该使用其中一个容器

std::vector<SomeBase>
std::list<SomeBase>

如果你真的需要动态分配的对象

std::vector<boost::shared_ptr<SomeBase>>
std::list<boost::shared_ptr<SomeBase>>

答案 3 :(得分:2)

每个人都提到了常见的SC ++ L控件,但是在C ++中执行此操作时还有另一个重要的警告(Chaoz已包含在his example中)。

在C ++中,您的集合需要在SomeBase上的SomeBase*而不是上进行模板化。如果您尝试将派生类型的实例分配给基本类型的实例,则最终会导致所谓的object slicing。这几乎肯定不是你想要做的。

由于您来自C#,请记住“SomeBase MyInstance”意味着两种语言都有很大不同。与此相当的C ++通常是“SomeBase* MyPointer”或“SomeBase& MyReference”。

答案 4 :(得分:1)

使用vector。看看here

答案 5 :(得分:1)

我是std :: deque的忠实粉丝。如果你想要免费的东西,deque会把它们给你。从列表的头部和尾部快速访问。迭代器,reverse_iterators,头部和尾部的快速插入。它不是超级专业,但你想要免费的东西。 ; - )

另外,我将链接一个很棒的STL参考。 STL是您在C ++中获得所有标准“免费”内容的地方。 Standard Template Library。享受!

答案 6 :(得分:0)

使用STL。例如std :: vector和std :: set。那里有很多例子。