向量构造函数创建少了一个元素的向量

vector constructor creating vector with one less element

本文关键字:向量 元素 创建 构造函数 少了一个      更新时间:2023-10-16

我正试图将向量拆分为"几乎相等"的部分,并为这些部分创建子向量。

我在这里提出了最初的问题:如何将向量拆分为n";几乎相等";部分,但我找到了一个非常好的解决方案,我正试图从这里使用:从向量中提取子向量的最佳方法?

我写了这个函数来为起始值和结束值创建整数(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],那么它终止于最后一个向量,并带有"下标超出范围"。

vector构造函数(以及所有接受指针范围的STL构造函数(被设计为接受一系列STL样式的迭代器。使用迭代器时,通过提供指向第一个和过去的结束元素的指针来指定范围,而不是第一个和最后一个元素。如果你想创建一个vector作为另一个vector的子范围(0.99(的副本,你可以写

vector<some> dest(source.begin(), source.begin() + 100);

请注意,这使用vector迭代器来指定前100个元素的切片,而不是operator[],后者在提供的索引越界时具有未定义的行为。在您的情况下,这种未定义的行为表现为运行时调试错误。迭代程序没有这个问题,因为它们是专门为这种方式设计的。

如果您想使用原始C++数组作为vector构造函数的输入,可以这样做:

vector<some> dest(source, source + 100);

希望这能有所帮助!

如果v是带有n元素的std::vector,则使用&v[n]是不合法的,但可以使用

vector<some> dest(v.begin()+first, v.begin()+last+1);

即使CCD_ 10。