Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从无副本的向量中提取子向量_C++_Iterator_Shared Ptr_Smart Pointers - Fatal编程技术网

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