通过引用获取最后的向量元素

时间:2015-12-10 14:20:14

标签: c++

我有以下代码将向量的一部分附加到另一个。

#include <algorithm>    // std::copy
#include <iostream>
#include <vector>
#include <cmath>
#include <assert.h>

using namespace std;

void copyVec(const std::vector<double> in, std::vector<double> &out, int start, unsigned int length) {
    assert(start>=0 && in.size()>=start+length);
    out.reserve(length);
    cout << in.at(9) << endl;
    out.insert(out.end(), &in.at(start), &in.at(start+length));
}

int main(int argc, char ** argv) {
    int start = 0;
    int end = 9;
    int window_size = 10;

    // initialize
    vector<double> vec1 = vector<double>(window_size);
    for (unsigned int i=0;i<window_size;++i) vec1[i] = i;
    vector<double> vec2 = vector<double>(window_size);
    for (unsigned int i=0;i<window_size;++i) vec2[i] = i*10;

    // print
    cout << "vec1: "; 
    for (unsigned int i=0;i<vec1.size();++i) cout << vec1[i] << " "; cout << endl;
    cout << "vec2: "; 
    for (unsigned int i=0;i<vec2.size();++i) cout << vec2[i] << " "; cout << endl;

    copyVec(vec1,vec2,start,end);

    // print
    cout << "vec2: "; for (unsigned int i=0;i<vec2.size();++i) cout << vec2[i] << " "; cout << endl;

    return 0;
}

我似乎无法通过引用访问vec2的最后一个元素。 此示例的输出(int end = 9)是

size: 10 start: 0 end: 9
vec1: 0 1 2 3 4 5 6 7 8 9 
vec2: 0 10 20 30 40 50 60 70 80 90 
in[9]: 9 &in[9]: 0x186d118
vec2: 0 10 20 30 40 50 60 70 80 90 0 1 2 3 4 5 6 7 8

当然,对于int end = 10,我得到一个超出范围的错误:

size: 10 start: 0 end: 10
vec1: 0 1 2 3 4 5 6 7 8 9 
vec2: 0 10 20 30 40 50 60 70 80 90 
in[9]: 9 &in[9]: 0xae1118
terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check
Aborted (core dumped)

那么我应该如何(有效地)附加最后一个向量元素?

2 个答案:

答案 0 :(得分:2)

您的插入应直接使用迭代器:

out.insert(out.end(), in.begin() + start, in.begin() + (start + length));

答案 1 :(得分:1)

正确的功能看起来像

#include <iterator>
#include <vector>

//...

void copyVec( const std::vector<double> &in, 
              std::vector<double> &out, 
              std::vector<double>::size_type start, 
              std::vector<double>::size_type length ) 
{
    assert( in.size() >= start + length );

    out.reserve( out.size() + length );

    out.insert( out.end(), std::next( in.begin(), start ), 
                           std::next( in.begin(), start + length ) );
}

第一个参数声明为常量引用。您应该考虑其当前大小为目标向量保留内存。 最好使用向量的自己的迭代器而不是原始指针。 startstart + length指定的范围为[start, start + length )

例如,复制整个矢量,你可以写

copyVec2b(vec1, vec2, 0, vec1.size() );

一般情况下,您可能无法写入

这样的功能
cout << in.at( start + length ) << endl;

因为索引start + length未包含在复制元素的范围内。

你可以写

if ( length != 0 ) cout << in.at( start + length - 1 ) << endl;