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,而不是新副本。(索引是我要从原始向量中提取的索引向量)
或者,我可以使用智能指针来做到这一点吗?
您将无法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 (如果您需要修改原始表示,您将存储偏移量而不是迭代器)。
每当我说我宣誓就职时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)
| 归档时间: |
|
| 查看次数: |
6742 次 |
| 最近记录: |