矢量构造函数创建矢量与少一个元素

时间:2011-07-28 19:11:27

标签: c++ vector iterator

我正在尝试将一个矢量分成"几乎相等"零件,并为这些零件创建子向量。

我在这里问过原来的问题: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;

2 个答案:

答案 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