我正在尝试将一个矢量分成"几乎相等"零件,并为这些零件创建子向量。
我在这里问过原来的问题:How to split a vector into n "almost equal" parts但是我发现了一个非常好的解决方案,我正在尝试使用,从这里开始:Best way to extract a subvector from a vector?
我编写了这个函数来创建起始值和结束值的整数(round是我的函数,它舍入到指定的数字。)
void split( double number, double parts )
{
double loop = number / parts;
for( int i = 0; i < parts; i++ )
{
int start = round( i * loop, 0 );
int end = round( ( i + 1 ) * loop - 1, 0 );
cout << start << " " << end << endl;
}
}
到目前为止这个功能运行正常,但我的问题是当我尝试运行时:
vector<some> dest( &source[start], &source[end] );
然后它创建一个LESS元素,然后需要。我的意思是,例如,如果我用
调用它vector<some> dest( &source[0], &source[99] );
然后它将有99个元素,而不是100. 为什么会发生这种情况?
如何解决?如果我使用[end + 1],那么它会终止于最后一个向量,&#34;下标超出范围。&#34;
答案 0 :(得分:4)
vector
构造函数(以及接受指针范围的所有STL构造函数)被设计为接受一系列STL样式的迭代器。使用迭代器时,可以通过提供指向first和last-the-end元素的指针来指定范围,而不是第一个和最后一个元素。如果你想创建一个vector
作为另一个vector
的子范围(0,99)的副本,你可以写
vector<some> dest(source.begin(), source.begin() + 100);
请注意,这使用vector
迭代器指定前100个元素的切片而不是operator[]
,当提供的索引超出范围时,它具有未定义的行为。在您的情况下,此未定义的行为表现为运行时调试错误。迭代器没有这个问题,因为它们专门设计为以这种方式使用。
如果要使用原始C ++数组作为vector
构造函数的输入,可以这样做:
vector<some> dest(source, source + 100);
希望这有帮助!
答案 1 :(得分:0)
虽然使用&v[n]
是不合法的,但如果v是带有std::vector
元素的n
,则可以使用
vector<some> dest(v.begin()+first, v.begin()+last+1);
即使last+1 == n
。