从一个矢量中提取一个子矢量,不需要复制
Extract a subvector from a vector without copy
我有一个大尺寸的向量,我想根据索引提取它的子向量。但是我不想做一个子向量的新拷贝。我可以使用指针迭代器来返回原始向量的指针吗?
类似:
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)
{
....
}
我想get的是get dest作为{3,5,6,8},它是指向原始的,而不是新的副本。(index是我要从原始向量中提取的索引向量)
或者,我可以使用智能指针做到这一点吗?
您将无法从另一个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]; }
};
如果你想独立于谁拥有实际的数组来处理相同的类型,事情就变得有点有趣了。在这种情况下,您可能希望创建类似上述array_view<T>
的东西,但也要为底层表示存储std::shared_ptr<std::vector<T>>
(如果需要修改原始表示,则存储偏移量而不是迭代器)。
每次我说我已经放弃了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;
然后如果(例如)我们打印出orig
的元素,代码如下:
for (int i=0; i<orig.size(); i++)
std::cout << orig[i] << "t";
…我们得到以下结果:
0 1 2 -1 4 -1 -1 7 -1 9
如果您希望向量是可变的,则不需要。如果你只是想传递一个子向量,而不改变其内容,为什么不改变你的各种函数来接受一个开始和结束迭代器,而不是传递一个向量呢?
相关文章:
- 为什么转换函数声明不需要至少一个定义类型说明符
- 将一个宏传递到另一个宏而不是直接传递内容时会出现不需要的额外"空"参数
- 是否可以使用另一个lua文件中定义的表,该表在当前文件中不需要作为模块
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 为什么在一个地方需要双倍英镑,而在这个宏观上不需要其他地方?
- 我写了一个自定义的咖啡层.但是在训练期间,它说“**层不需要向后计算”
- 缓冲区用不需要的数据填充 char 数组中的最后一个空格
- 编译一个不支持c++11和.cxx文件的cuda代码需要一个带有vexcl示例的c++11
- 执行一个新的完全独立的进程,该进程封装在一个可执行文件中,而不需要为独立进程将文件写入磁盘
- 有没有一种方法可以在一个平台上编写c++程序,而不需要为不同的操作系统重新编写
- 在不需要主表达式时" / "之前期待一个主要表达式
- glDrawArrays() 会自动绘制另一个不需要的对象
- 如果函数指针不需要 amp; 符号,为什么 boost::bind 需要一个?
- 为什么自定义数据的 thrust::sort 需要一个默认的构造器,而 STL::sort 不需要?
- 遇到错误问题:在'{'之前,预期的非限定 id 只是一个我需要的类的标头,只是不确定导致错误的原因
- 有没有一个用于SQLite的C#库不需要C++运行时
- 为什么我不需要解引用一个char指针来输出c风格的字符串?
- 如何输出x=y^x, y=x而不需要另一个变量
- 如何制作一个不需要用户使用特定版本的Visual Studio的c++ API
- 如何创建一个不需要调用方向其传递参数计数的可变参数函数?