请考虑以下代码:
int main()
{
typedef boost::ptr_vector<int> ptr_vector;
ptr_vector vec0;
vec0.push_back(new int(1));
vec0.push_back(new int(2));
vec0.push_back(new int(3));
vec0.push_back(new int(4));
vec0.push_back(new int(5));
ptr_vector::iterator last = boost::prior(vec0.end()),
first = boost::prior(last, 3);
ptr_vector vec1(first, last); // this will copy '2, 3, 4' to vec1
struct print
{
void operator()(int const& i) {
std::cout << i.m_i << std::endl;
}
};
std::for_each(vec0.begin(), vec0.end(), print()); // 1, 2, 3, 4, 5
std::for_each(vec1.begin(), vec1.end(), print()); // 2, 3, 4
return 0;
}
我不希望将copy
元素转换为vec1
,而是以shared_ptr<>
提供的方式共享。我的要求主要是:
shared_ptr::unique()
)两个容器都属于同一类。因此,它们具有相同的范围并且将同时被销毁。这些类的构造函数构造两个容器。施工后,这些容器不会有任何改动。
我是否需要使用std::vector<>
代替shared_ptr<>
,还是有其他解决方案?
答案 0 :(得分:3)
是的,您应该使用vector<shared_ptr<int>>
。
由于您只使用范围,因此可以组合一个自定义解决方案来跟踪范围及其交叉点(用于实现unique
。)然后,您可以将所有内容存储在矢量中并具有范围索引。这可能会更快(仅仅考虑到避免的缓存未命中),但实施起来会更多。