c++ - vector constructor 创建少一个元素的 vector

标签 c++ vector iterator

我正在尝试将 vector 拆分为“几乎相等”的部分,并为这些部分创建子 vector 。

我在这里问了原来的问题: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],那么它会在最后一个 vector 处终止,并显示“下标超出范围”。

最佳答案

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);

希望这对您有所帮助!

关于c++ - vector constructor 创建少一个元素的 vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6864364/

相关文章:

Java Vector : Each element contains three objects. 如何根据其中之一的值进行操作?

c++ - 排序 vector : how to have the boolian function accept a third variable

c++ - unique_ptr 与 vector : error: call to implicitly-deleted copy constructor of XXX

java - 从方法返回迭代器

c++ - 遍历结构变量

c++ - 在 While 循环中使用 != 的正确方法?...或者 ..?

c++ - 无法打印 CSV 文件

c++ - 如何使用 C 或 C++ 从 dll 中读取导出表?

c++ - 使用 get 函数与公开成员变量

c++ - 如何在我的类(class)允许 range-for 循环?