【问题标题】:C++: subvector from a vector as an argument to a functionC ++:来自向量的子向量作为函数的参数
【发布时间】:2013-04-01 04:58:26
【问题描述】:

我使用另一个库中的一个函数,该函数将任何 STL 顺序容器作为参数。只是为了争论,我将它保留为std::vector

do_something (std::vector<double>& k)
{
    ...
}

我有一个完整的vector 数据(恰好是double 类型)有没有办法通过引用传递子向量,并且不复制分割向量之前,这个功能?它通过复制直接进行(通过简单地复制 subvector,从函数返回 vector 并将相应的 subvector 放回 vector)。为什么?:

  1. 我不想复制的原因完全是因为速度,我会多次(我的意思是很多次)调用这个函数,性能是最重要的。
  2. 我不想事先拆分向量的原因是文件 IO 操作。顺序向量允许快速文件写入,尤其是在二进制模式下

换句话说,我可以做这样的事情吗(在下面的 pseudocode 示例中)?

std::vector<double> myVector{1.2, 5.6, 8.6, 2.2, 1.7, 9.1}; // myVeector of size 6

do_something (&myVector[ -- elementss 2,3,4--]);

感谢任何帮助,即使不可能,并且如果您知道一种有效来回复制的方法

注意:如果对 SO 程序员有任何帮助,我的向量将具有相同的大小和相同的预定位子向量,不等于来自 myVector.begin()myVector.back()。对于那个向量,这也永远不会改变

【问题讨论】:

标签: c++ function vector arguments


【解决方案1】:

不,不能这样做。这就是为什么标准算法接受两个(或更多)迭代器作为参数,而不是一个容器。

您还可以查看 Boost.Range 库,它允许范围适配器包括切片。

根据您调用的此函数模板中的内容,您可能能够传递切片范围来代替序列,因为 Boost 中定义的具体范围确实具有 begin() 和 @987654322 @ 成员函数。但是由于它需要对容器的非常量引用,因此它有可能会添加或删除元素,在这种情况下,您会很不走运。

【讨论】:

    猜你喜欢
    • 2014-09-03
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2013-09-27
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多