c++ - 如何初始化使用 auto 关键字声明的循环计数器?
问题描述
这是我的代码:
#include <iostream>
#include <vector>
void cumulative_sum_with_decay(std::vector<double>& v)
{
for (auto i = 2; i < v.size(); i++) {
v[i] = 0.167 * v[i - 2] + 0.333 * v[i - 1] + 0.5 * v[i];
}
}
void printv(std::vector<double>& v)
{
std::cout << "{";
for (auto i = 0; i < v.size() - 1; i++) {
std::cout << i << ", ";
}
std::cout << v[v.size() - 1] << "}\n";
}
int main()
{
auto v = std::vector<double>{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cumulative_sum_with_decay(v);
printv(v);
}
当我尝试编译和运行该程序时,我收到以下警告:
$ clang++ -std=c++11 -Wextra foo.cpp && ./a.out
foo.cpp:6:24: warning: comparison of integers of different signs: 'int' and 'std::__1::vector<double,
std::__1::allocator<double> >::size_type' (aka 'unsigned long') [-Wsign-compare]
for (auto i = 2; i < v.size(); i++) {
~ ^ ~~~~~~~~
foo.cpp:14:24: warning: comparison of integers of different signs: 'int' and 'unsigned long'
[-Wsign-compare]
for (auto i = 0; i < v.size() - 1; i++) {
~ ^ ~~~~~~~~~~~~
2 warnings generated.
{0, 1, 2, 3, 4, 5, 6, 7, 8, 8.68781}
如何初始化这些声明的循环计数器auto
,以使代码安全且没有警告?
请注意,虽然我这里有一个小向量,但我正在尝试学习如何编写安全代码,auto
即使向量太大以至于 in 的值i
可能超出整数范围。
解决方案
您可以使用 'decltype(v.size())' 来获取正确的类型。
for (decltype(v.size()) i = 2; i < v.size(); i++)
推荐阅读
- ionic3 - 如何在 Angular 6 中添加 ng2-smart-table 嵌套列
- python - 删除和移动熊猫 df 中的值
- file - 寻找在 docker 上运行的两个 Web 应用程序之间存储文件的最佳方式
- google-app-maker - AppMaker:每个部署的环境变量?获取部署名称?
- vuejs2 - vue2-google-maps 在 vue.js 中添加自定义标记
- appium-ios - 在 Bitrise for Appium iOS 测试中获取元素的可见性为 false
- abap - 如何在网格上制作表格大小,如 ABAP 中的容器大小
- c# - Xamarin Forms - 根据原始源文件大小在 C# 中设置图像大小
- linux - 如何列出加载到内核中的所有 bpf 程序?(例如 tc-bpf)
- javascript - JavaScript Array to URLencoded - obj 中的 wthis 数组