C++ 中与 C# Collection<T> 相对应的是什么?如何使用它?

3

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

我知道可以使用数组:

SomeBase* _anArrayOfBase = new SomeBase[max];

但是这个方法并不是“免费”的,换句话说,我不能迭代它,它也不会自动扩展等等。

那么还有哪些其他选择呢?

谢谢。


实际上,您可以遍历一个数组。起始迭代器是“_anArrayOfBase”,结束迭代器是“_anArrayOfBase + max”,这就是您进行C++样式迭代所需的全部内容。但是您关于扩展的想法是绝对正确的。 - Steve Jessop
7个回答

18

std::vector是一个数组的包装器,但是它可以自动扩展。然而,自动扩展是一项非常昂贵的操作,因此如果您需要进行大量的插入或删除操作,请不要使用向量(vector)。(您可以使用reserve函数来预留一定量的空间)

std::list是一个链表,具有更快的插入和删除时间,但迭代速度较慢,因为值不存储在连续的内存中,这意味着地址计算更加复杂,在遍历列表时无法利用处理器的缓存。与向量(vector)或双端队列(deque)相比,它最大的优势在于可以相对便宜地从列表的任何位置添加或删除元素。

作为一种折中方案,std::deque在外部方式上类似于向量(vector),但在内部实现上有很大的区别。双端队列(deque)的存储不必连续,因此可以分成块,这意味着当双端队列(deque)增长时,它不必重新分配整个内容的存储空间。访问略慢,无法使用指针算术运算获取元素。


9

您应该使用向量。

#include <vector>

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

C++中包含了STL中的一系列数据容器。 在这里查看STL


4

您应该使用其中一个容器

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

如果您确实需要动态分配对象

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

2

大家都提到了常见的 SC++L 控件,但在 C++ 中进行此操作时还有另一个重要的注意事项(Chaoz 在 他的示例 中已包含)。

在 C++ 中,您的集合将需要以 SomeBase* 为模板,而不是 SomeBase。如果您尝试将派生类型的实例分配给基本类型的实例,则最终会导致所谓的对象切片。这几乎肯定不是您想做的。

由于您来自 C#,只需记住,在两种语言中,“SomeBase MyInstance”的含义非常不同。C++ 中的等效语句通常是“SomeBase* MyPointer”或“SomeBase& MyReference”。


1

使用 vector。在这里看看这里


1

我是std::deque的铁杆粉丝。如果你想要免费的东西,deque可以给你。从列表的头部和尾部快速访问,迭代器,反向迭代器,快速插入头部和尾部。它不是特别专业化,但是你想要免费的东西。;-)

另外,我会提供一个很好的STL参考。STL是在C++中获得所有标准“免费”东西的地方。标准模板库。享受!


0
使用STL,例如std::vector和std::set。有很多相关的例子可以参考。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接