C++ 从无副本的向量中提取子向量
我有一个大尺寸的向量,我想根据索引提取它的子向量。但我不想制作子向量的新副本。 我可以使用指针迭代器返回原始向量的指针吗 比如:C++ 从无副本的向量中提取子向量,c++,iterator,shared-ptr,smart-pointers,C++,Iterator,Shared Ptr,Smart Pointers,我有一个大尺寸的向量,我想根据索引提取它的子向量。但我不想制作子向量的新副本。 我可以使用指针迭代器返回原始向量的指针吗 比如: vector<int> orig = { 0,1,2,3,4,5,6,7,8,9 }; vector<int> index = { 3,5,6,8 }; vector<int> dest (vector<int> orig, vector<int> index) { .... } vector o
vector<int> orig = { 0,1,2,3,4,5,6,7,8,9 };
vector<int> index = { 3,5,6,8 };
vector<int> dest (vector<int> orig, vector<int> index)
{
....
}
vector orig={0,1,2,3,4,5,6,7,8,9};
向量指数={3,5,6,8};
矢量目标(矢量源、矢量索引)
{
....
}
我想要得到的是得到dest为{3,5,6,8},它指向orig,但不是新的副本。
(index是我要从原始向量中提取的内容的索引向量)
或者,我可以使用智能指针来执行此操作吗?如果您希望向量是可变的,则不可以。如果您只想传递子向量,但不更改内容,为什么不将各种函数更改为使用开始和结束迭代器,而不是传递向量?您将无法从另一个
std::vector
的子范围创建std::vector
。但是,您可以通过将迭代器存储到拥有实际值的std::vector
中的视图进行访问:
template <typename Iterator>
class array_view {
Iterator begin_;
Iterator end_;
public:
// ...
array_view(Iterator begin, Iterator end): begin_(begin), end_(end) {}
Iterator begin() const { return this->begin_; }
Iterator end() const { return this->end_; }
typename std::iterator_traits<Iterator>::reference
operator[](std::size_t index) { return this->begin_[index]; }
};
模板
类数组视图{
迭代器begin;
迭代器结束;
公众:
// ...
数组\视图(迭代器开始,迭代器结束):开始\开始(开始),结束\结束(结束){
迭代器begin()常量{返回此->开始}
迭代器end()常量{返回this->end;}
typename std::迭代器_traits::reference
运算符[](std::size_t index){返回此->开始_[index];}
};
如果您想独立于实际阵列的所有者处理同一类型,事情会变得有点有趣。在这种情况下,您可能希望创建类似上面的
array\u视图
,但同时也为基础表示存储一个std::shared\u ptr
(如果需要修改原始表示,则存储偏移量而不是迭代器)。每次我说我发誓退出std::valarray
,有人提出了这样一个问题,valarray
非常直接地支持这个问题。例如:
std::valarray<int> orig = { 0,1,2,3,4,5,6,7,8,9 };
std::valarray<size_t> index = { 3,5,6,8 };
orig[index] = -1;
。。。我们得到以下结果:
0 1 2 -1 4 -1 -1 7 -1 9
指针的问题是,一旦向量调整大小,指针就会失效;您想要的似乎与此不兼容。我没有找到使用迭代器start和end从具有非连续索引的向量中提取的方法。Cna你举一个简单的例子吗?不,如果列表中有空白,它就不起作用了。您可以在上面做一个变体,其中保存开始/结束迭代器对的列表,但如果没有很好的理由,我真的不会建议这种复杂程度。
valarray
看起来很有趣!与向量比较的相关问题:
0 1 2 -1 4 -1 -1 7 -1 9