我有以下代码将向量的一部分附加到另一个。
#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)
那么我应该如何(有效地)附加最后一个向量元素?
答案 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 ) );
}
第一个参数声明为常量引用。您应该考虑其当前大小为目标向量保留内存。
最好使用向量的自己的迭代器而不是原始指针。
start
和start + 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;