我有一个关于引用集合子集的快速问题。 考虑我有一个对象矢量。现在我想创建另一个向量,它是此向量的子集,我不想创建对象子集的副本。
我想到的一种方法是创建一个vector<auto_ptr<MyClass> >
。这是一个好方法吗?
如果您认为在这种情况下任何其他容器或习语或模式会有所帮助,请建议。
谢谢
答案 0 :(得分:7)
不!请参阅:Why it is wrong to use std::auto_ptr<> with STL containers ?
现在,作为替代方案,您可以根据需要存储原始指针或boost::shared_ptr
。
答案 1 :(得分:2)
另一种可能更多的STL方式是使用一个向量但使用迭代器对跟踪子范围(注意所有算法都使用迭代器,正是出于这个原因)
答案 2 :(得分:0)
您可以使用索引向量:vector<int>
(或vector<size_t>
如果您想要迂腐)。这比存储指针(一般意义上的指针:原始C / C ++指针,shared_ptr
,iterator
等)如果包含的向量不是常量更好。
考虑以下情况:“大”矢量包含苹果,橙子和柠檬,而“小”矢量包含指向苹果的指针。如果你向大向量添加一堆其他水果,STL将重新分配向量的存储,因此指向apple的指针将无效(指向释放的内存)。
如果可以使用上述方案,请使用索引向量。如果不可能,请使用其他技术(例如原始指针向量或对象副本向量)。
答案 3 :(得分:0)
If the subsection is contiguous you can reference the subsection using an iterator and a count indicating how many items you are referencing.
The sane way to do this would be to create some sort of templated class which you could construct with a container reference and two indices, and let the class do all the bounds and error checking, though I'm unsure how you'd be able to tell if the underlying container still existed at some later time...