首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量中的“一过最后元素”是什么意思?

向量中的“一过最后元素”是什么意思?
EN

Stack Overflow用户
提问于 2016-01-16 17:53:27
回答 4查看 3.8K关注 0票数 9

我正在学习向量,对数组是如何复制到这里的向量感到困惑

代码语言:javascript
复制
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是什么吗?为什么?

EN

回答 4

Stack Overflow用户

发布于 2016-01-16 17:58:34

不要从STL容器中取消引用end()rend(),因为它们没有指向有效的元素。

下面的图片可以帮助您可视化这一点。

半开放范围的优点是:

  1. 当begin() == end()
  2. 可以通过检查来直观地遍历元素,直到迭代器等于end()为止。
票数 14
EN

Stack Overflow用户

发布于 2016-01-16 18:03:50

强耦合容器(例如向量、列表、映射)是迭代器的概念。迭代器是指针的C++抽象。例如,迭代器指向容器内的一个对象(或者指向最后一个元素),取消迭代器意味着访问该元素。

例如,让我们以一个包含4个元素的向量为例:

代码语言:javascript
复制
| 0 | 1 | 2 | 3 |  |
  ^           ^   ^
  |           |   |
  |           |   one past the end (outside of the container elements)
  |           last element           
  first element

标准模板库中的(算法)操作范围,而不是容器。这样,不仅可以将操作应用于整个容器,还可以应用于范围(容器的连续元素)。

范围由[first, last)指定(包括第一个,排他的最后一个)。这就是为什么您需要一个迭代器来结束:指定一个等于容器的整个内容的范围。但是当迭代器指向它之外时,取消引用是非法的。

票数 5
EN

Stack Overflow用户

发布于 2016-01-16 18:01:21

std::vector的构造函数有几个重载。

对于std::vector<double> a(3,5);,使用了填充构造函数:

代码语言:javascript
复制
explicit vector (size_type n);
         vector (size_type n, const value_type& val,
                 const allocator_type& alloc = allocator_type());

这将接受一个size参数作为它的第一个参数以及一个可选的和第三个参数,第二个参数指定要给新创建的对象赋值的值。

代码语言:javascript
复制
double p[] = {1, 2, 3, 4, 5};
std::vector<double> a(p, p+5);

使用构造函数的另一个重载,即范围构造函数:

代码语言:javascript
复制
template <class InputIterator>
  vector (InputIterator first, InputIterator last,
          const allocator_type& alloc = allocator_type());

这需要一个迭代器来启动集合和end()迭代器,并遍历并添加到vector,直到first == last

之所以将end()实现为one-past-the-last-element,是因为它允许实现检查是否相等,如下所示:

代码语言:javascript
复制
while(first != last)
{
  //savely add value of first to vector
  ++first;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34830192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档