矢量<double>::size_type vs. 双倍
vector<double>::size_type vs. double
为什么要在for loop
中使用vector<double>::size_type
,而不仅仅是double
?我以前从未真正弄乱过C++
矢量,我正在阅读本网站关于它们的教程。作者将他们的for loop
写成
for (vector<double>::size_type i = 0; i < 20; i++)
{
cout << "Enter marks for student #" << i+1
<< ": " << flush;
cin >> student_marks[i];
}
我可以看到它是双向工作的,但为什么要以上述方式使用它们,而不是简单地将计数器(i
(声明为基元类型?我看到了这个老SO的帖子,但我仍然不确定。
如果希望代码可移植和可维护,则必须使用定义的size_type在要索引的容器中。
如果您想要99%的解决方案,那么目前,至少在gcc上,所有size_types都是而不是size_t的typedefs(这是一个无符号的int(,所以您可以使用size_t。但是,要明白这种情况将来可能会改变,您的代码可能会停止工作或停止编译。
基本类型可分为浮点型和算术型。浮点类型对索引建模来说真的很糟糕,因为它的主要目的是能够表示本质上不是积分的值。对一个值为1.75的向量进行索引会得到什么结果?要么在位置1或2索引到向量中,但在位置1.75没有对象。
可用于索引容器的可能值的范围会出现不同的问题。有不同的积分类型,如unsigned char
或short
,虽然它们自然适合索引的目的,但其范围可能远小于容器的大小,因此不能用于访问向量中的任何位置,有些可能具有无效索引值,如-1。这两者都是double
的问题:它可以表示作为索引毫无意义的负值,并且不能精确地表示uint64_t
中的所有值(这是64位架构中size_type
的常见类型(。
标准库要求每个容器都提供一个嵌套类型(或typedef
(,可用于对容器进行索引。这将是一个整数无符号类型,其大小足以引用容器中的任何元素。使用嵌套的typedef
意味着,无论何时使用不同的实现、不同的体系结构或不同的编译器构建程序,它都将始终是正确的索引类型。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 'Incomplete type'在VS中使用glm::vec3和ReSharper时的警告
- c operator()括号 - 运算符type()vs type operator()
- C++ "using std::<type>" vs 呼叫 std::<type> 每次
- GCC vs. Clang:"invalid use of incomplete type" std::d eclval 和模板专业化
- C++函数模板专用声明和模板参数;无 vs. <> vs. <type>
- ' auto x = type{…} '初始化语法和'显式'转换操作符- clang vs gcc