我需要在C++中存储一个动态创建的基本类型对象列表/集合/数组(我是C++的新手)。在C#中,我会使用泛型集合,那么在C++中我该使用什么?
我知道可以使用数组:
SomeBase* _anArrayOfBase = new SomeBase[max];
但是这个方法并不是“免费”的,换句话说,我不能迭代它,它也不会自动扩展等等。
那么还有哪些其他选择呢?
谢谢。
我需要在C++中存储一个动态创建的基本类型对象列表/集合/数组(我是C++的新手)。在C#中,我会使用泛型集合,那么在C++中我该使用什么?
我知道可以使用数组:
SomeBase* _anArrayOfBase = new SomeBase[max];
但是这个方法并不是“免费”的,换句话说,我不能迭代它,它也不会自动扩展等等。
那么还有哪些其他选择呢?
谢谢。
std::vector是一个数组的包装器,但是它可以自动扩展。然而,自动扩展是一项非常昂贵的操作,因此如果您需要进行大量的插入或删除操作,请不要使用向量(vector)。(您可以使用reserve函数来预留一定量的空间)
std::list是一个链表,具有更快的插入和删除时间,但迭代速度较慢,因为值不存储在连续的内存中,这意味着地址计算更加复杂,在遍历列表时无法利用处理器的缓存。与向量(vector)或双端队列(deque)相比,它最大的优势在于可以相对便宜地从列表的任何位置添加或删除元素。
作为一种折中方案,std::deque在外部方式上类似于向量(vector),但在内部实现上有很大的区别。双端队列(deque)的存储不必连续,因此可以分成块,这意味着当双端队列(deque)增长时,它不必重新分配整个内容的存储空间。访问略慢,无法使用指针算术运算获取元素。
您应该使用向量。
#include <vector>
int main()
{
std::vector<SomeBase*> baseVector;
baseVector.push_back(new SomeBase());
}
C++中包含了STL中的一系列数据容器。 在这里查看STL。
您应该使用其中一个容器
std::vector<SomeBase>
std::list<SomeBase>
如果您确实需要动态分配对象
std::vector<boost::shared_ptr<SomeBase>>
std::list<boost::shared_ptr<SomeBase>>
我是std::deque的铁杆粉丝。如果你想要免费的东西,deque可以给你。从列表的头部和尾部快速访问,迭代器,反向迭代器,快速插入头部和尾部。它不是特别专业化,但是你想要免费的东西。;-)
另外,我会提供一个很好的STL参考。STL是在C++中获得所有标准“免费”东西的地方。标准模板库。享受!