我需要在C ++中存储一个动态创建的特定基类型对象的列表/集合/数组(我是C ++的新手)。在C#中我会使用泛型集合,我在C ++中使用什么?
我知道我可以使用数组:
SomeBase* _anArrayOfBase = new SomeBase[max];
但是我没有得到任何“免费”的东西 - 换句话说,我不能迭代它,它不会自动扩展等等。
那么还有其他选择吗?
由于
答案 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。那里有很多例子。