【问题标题】:Iterator arithmetic type迭代器算术类型
【发布时间】:2015-04-27 01:14:57
【问题描述】:

我看到很多人决定使用签名 int,但在我看来,这似乎是出于无知,因为这会导致使用未签名 size_types 的容器类型出现签名/未签名不匹配。

由于无法获取所提供迭代器的容器类型,因此我看不到获取假定容器的size_type 以执行准确算术的方法。

在迭代器上执行算术运算时应该使用什么类型?或者更好的是,由于迭代器不知道其父容器,如何获得容器的底层size_type

编辑2:

我所说的基本尺寸类型是指,例如:

std::vector<some_type>::size_type

对于一些容器类型为std::vector&lt;some_type&gt;的迭代器

编辑1:

我认为 C++17 正在通过一些容器访问函数来解决这个问题:

这些非成员函数为容器、普通数组和 std::initializer_list 提供通用接口。

  • (function) size (C++17) 返回容器或数组的大小
  • (function) empty (C++17) 检查容器是否为空
  • (函数)数据(C++17)获取指向底层数组的指针

更具体地说,size 给出了父容器的 size 字段的声明类型。

【问题讨论】:

  • 例如,RandomAccessIterator 定义了运算符+=+,它们接受一个有符号整数并返回一个迭代器。为什么这会产生有符号/无符号不匹配警告或需要知道size_type
  • 您基本上是在问您是否可以仅从迭代器中获得size_type?答案是否定的,考虑一个将迭代器实现为指针的实现,它们没有关于容器的任何信息。迭代器“知道”如何前进,那么为什么需要底层的size_type
  • 你能举个例子,给你迭代器,你需要容器​​的size_type吗?如果迭代器是指向普通数组的指针怎么办?
  • @vsoftco 因为就像你说的那样,迭代器没有关于容器的信息,我正在编写的函数也没有。
  • @FranciscoAguilera 也许你应该发布一个最小的例子并告诉我们问题可能是什么。我认为将size_tstd::distance/std::next/std::advance 结合使用在大多数情况下都足够安全。我无法想象一个标准容器会使用int_8t 作为其元素,所以你不会溢出......

标签: c++


【解决方案1】:

我的建议是使用std::iterator_traits&lt;It&gt;::difference_typeIt 是迭代器类型),通常是(但不是强制)std::ptrdiff_tstd::ptrdiff_t签名类型的别名。

我推荐这个是因为以下事实:

  1. std::distance 返回std::iterator_traits&lt;It&gt;::difference_type
  2. std::nextstd::prevstd::iterator_traits&lt;It&gt;::difference_type 为参数。
  3. 双向迭代器的算术可能会倒退。

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 2014-11-13
    • 2021-09-03
    • 2015-10-24
    • 2013-11-25
    • 2020-10-05
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多