为什么随机访问迭代器的算术运算符接受/返回 int 而不是 size_t?
Why do random access iterator's arithmetic operators accept / return int and not size_t?
由于对std::vector
的大多数操作都需要/返回size_t
-这就是我用于索引的类型。但是现在我已经启用了所有编译器警告来修复一些有符号/无符号转换问题,我知道我有,这条消息让我感到惊讶:
警告:'argument':从'size_t'转换为'__w64 int',有符号/无符号不匹配
它是由以下代码生成的:
std::vector<int> v;
size_t idx = 0;
v.insert(v.begin() + idx + 1, 0);
我得到了很多其他类似的消息,暗示迭代器的算术运算符接受并返回int
。为什么不是size_t
?修复所有这些消息是一件痛苦的事情,并且不会使我的代码更漂亮!
我得到了很多其他类似的消息,暗示迭代器的算术运算符接受并返回
int
。
不一定是int
。它是由迭代器类型iterator_traits
定义的(带符号的)difference_type
。对于大多数迭代器类型,默认为ptrdiff_t
。
为什么不是
size_t
?
因为算术需要正确地处理有符号值;可以期望it + (-1)
等于it - 1
。
它允许像it += index;
这样的东西,其中index
可以是正的或负的(根据某些逻辑)。
与以下内容比较:
if (some_condition)
it += index;
else
it -= index;
如果只能传递无符号值,则需要
相关文章:
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 返回 int 中可被 2 c++ 整除的所有数字的总和
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 我的运算符重载没有在我的 int main 中返回?
- 为什么我不能返回向量<向量<int>>(进程返回 -1073741819 (0xC0000005))
- 如何使用 SWIG 将 C++ int** 返回值给 Python
- 为什么"unsigned int" + "unsigned int"返回"unsigned int"?
- std::sort in vector<int> 返回 0 而不是值
- 使用 static int 返回 int&in 函数
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- int返回垃圾价值
- C++字符串流>> int 返回零
- 为什么numeric_limits::min对int返回负值,而对float/double返回正值?
- 无法将字符串转换为 int 作为回报。在 int 返回函数 getsocial() 中没有声明任何字符串变量
- 在 int 返回函数中返回"false"
- C/ c++程序将输出(int)返回给其他程序