【发布时间】:2015-04-27 01:14:57
【问题描述】:
我看到很多人决定使用签名 int,但在我看来,这似乎是出于无知,因为这会导致使用未签名 size_types 的容器类型出现签名/未签名不匹配。
由于无法获取所提供迭代器的容器类型,因此我看不到获取假定容器的size_type 以执行准确算术的方法。
在迭代器上执行算术运算时应该使用什么类型?或者更好的是,由于迭代器不知道其父容器,如何获得容器的底层size_type?
编辑2:
我所说的基本尺寸类型是指,例如:
std::vector<some_type>::size_type
对于一些容器类型为std::vector<some_type>的迭代器
编辑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_t与std::distance/std::next/std::advance结合使用在大多数情况下都足够安全。我无法想象一个标准容器会使用int_8t作为其元素,所以你不会溢出......
标签: c++