从没有副本的向量中提取子向量

duq*_*ner 5 c++ iterator smart-pointers shared-ptr

我的向量很大,我想根据索引提取其子向量。但是我不想为子向量创建新副本。我可以使用指针迭代器返回原始向量的指针吗?

就像是:

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) 
{
   .... 
}
Run Code Online (Sandbox Code Playgroud)

我想要得到的是{3,5,6,8}作为dest,它指向orig,而不是新副本。(索引是我要从原始向量中提取的索引向量)

或者,我可以使用智能指针来做到这一点吗?

Die*_*ühl 5

您将无法std::vector<T>从另一个std::vector<T>. 但是,您可以根据视图将迭代器存储到std::vector<T>拥有实际值的视图中:

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]; }
};
Run Code Online (Sandbox Code Playgroud)

如果你想独立于谁拥有实际数组来处理相同的类型,事情会变得有点有趣。在这种情况下,您可能想要创建类似array_view<T>上面的内容,但还要std::shared_ptr<std::vector<T>>为底层表示存储 a (如果您需要修改原始表示,您将存储偏移量而不是迭代器)。


Jer*_*fin 5

每当我说我宣誓就职时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;
Run Code Online (Sandbox Code Playgroud)

然后,如果(例如)我们orig使用以下代码打印出元素:

for (int i=0; i<orig.size(); i++)
    std::cout << orig[i] << "\t";
Run Code Online (Sandbox Code Playgroud)

...我们得到以下结果:

0       1       2       -1      4       -1      -1      7       -1      9
Run Code Online (Sandbox Code Playgroud)


Gab*_*han 3

如果您希望向量是可变的,则不行。如果您只想传递子向量而不更改内容,为什么不更改各种函数以采用开始和结束迭代器而不是传递向量呢?