我正在学习向量,对数组是如何复制到这里的向量感到困惑
double p[] = {1, 2, 3, 4, 5};
std::vector<double> a(p, p+5);我也知道std::vector<double> a(3,5);的意思是‘为3腾出空间,用5初始化它们。上面的代码是如何工作的?
第二点是,我从复制上述代码的地方阅读了这段代码。
在使用向量或任何其他标准容器时,理解第二点至关重要。受控序列总是以[第一,一过去-最后)-not的方式表示,它只适用于ctors,但也适用于在一系列元素上操作的每个函数。
我不知道[first, one-past-last)是什么意思?我知道数学上的,但不知道为什么/如何向量复制数组这种方式?
编辑的
另一个相关问题
成员函数
end()返回一个在序列中“指向”one-past-the-last-element的迭代器。注意,取消引用end()返回的迭代器是非法的,并且有未定义的结果。
你能解释一下这个one-past-the-last-element是什么吗?为什么?
发布于 2016-01-16 17:58:34
不要从STL容器中取消引用end()或rend(),因为它们没有指向有效的元素。
下面的图片可以帮助您可视化这一点。

半开放范围的优点是:
发布于 2016-01-16 18:03:50
强耦合容器(例如向量、列表、映射)是迭代器的概念。迭代器是指针的C++抽象。例如,迭代器指向容器内的一个对象(或者指向最后一个元素),取消迭代器意味着访问该元素。
例如,让我们以一个包含4个元素的向量为例:
| 0 | 1 | 2 | 3 | |
^ ^ ^
| | |
| | one past the end (outside of the container elements)
| last element
first element标准模板库中的(算法)操作范围,而不是容器。这样,不仅可以将操作应用于整个容器,还可以应用于范围(容器的连续元素)。
范围由[first, last)指定(包括第一个,排他的最后一个)。这就是为什么您需要一个迭代器来结束:指定一个等于容器的整个内容的范围。但是当迭代器指向它之外时,取消引用是非法的。
发布于 2016-01-16 18:01:21
std::vector的构造函数有几个重载。
对于std::vector<double> a(3,5);,使用了填充构造函数:
explicit vector (size_type n);
vector (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());这将接受一个size参数作为它的第一个参数以及一个可选的和第三个参数,第二个参数指定要给新创建的对象赋值的值。
double p[] = {1, 2, 3, 4, 5};
std::vector<double> a(p, p+5);使用构造函数的另一个重载,即范围构造函数:
template <class InputIterator>
vector (InputIterator first, InputIterator last,
const allocator_type& alloc = allocator_type());这需要一个迭代器来启动集合和end()迭代器,并遍历并添加到vector,直到first == last。
之所以将end()实现为one-past-the-last-element,是因为它允许实现检查是否相等,如下所示:
while(first != last)
{
//savely add value of first to vector
++first;
}https://stackoverflow.com/questions/34830192
复制相似问题