我想避免关于unsigned int和signed int之间的比较的警告。
我使用循环,例如:
for (int i =0 ; i < vec.size(); i++) {
// do something
}
给出了这些警告(这本身很好,我想要高级别的警告)。
我想把它改成以下内容:
for (auto i = vec.size()*0; i < vec.size(); i++) {
// do something
}
在这种情况下,我没有得到警告。但我想知道是否有更优雅的东西,它会自动推断出迭代器所需的类型。
答案 0 :(得分:8)
使用基于范围的循环
for (auto& i : vec)
{
cout << *i;
}
使用迭代器。
for (auto it = vec.begin(), end_it = vec.end(); it != end_it; ++it)
{
cout << *it;
}
如果您想要一个计数器,请使用std::vector<T>::size_type
或size_t
如果您是懒惰的。
答案 1 :(得分:1)
如果这是一个选项,则更喜欢<algorithm>
中的标准库高阶基元,例如(不限于):
std::accumulate
std::copy
std::transform
与lambdas一起使用时,它们非常富有表现力。仅当for
不是选项时才使用{{1}},并且更喜欢range-for循环。
答案 2 :(得分:0)
甚至是下降循环:
auto i = vec.size();
while (i --> 0)
// ...
答案 3 :(得分:-1)
因为问题以短语开头:
“我想避免在unsigned int和。之间进行比较的警告 签署了“
我假设vec.size()
返回unsigned int
。
如果vec.size()
返回的类型可以存储在unsigned int
中,那么您可以使用以下内容。
for (auto i = 0u; i < vec.size(); i++) {
// do something
}
否则使用适当的类型或检查其他答案。
如果vec
的类型为std::vector<T>
(未提及,因此上面的代码),您也可以使用for_each循环(也未提及)
std::for_each(vec.begin(), vec.end(), [](T t){ /* do something with t */ });
std::for_each(vec.begin(), vec.end(), [](T & t){ /* do something with t */});
std::for_each(vec.begin(), vec.end(), [](const T & t){ /* do something with t */ });
如果你必须使用一些已经存在的函数对象(或方法,或非成员函数)遍历向量元素,那么它会更方便
void f(int x) { std::cout << "f: " << x << "\n"; }
void g(int x) { std::cout << "g: " << x << "\n"; }
...
std::vector<int> vec{1, 2, 3};
std::for_each(vec.begin(), vec.end(), std::bind(f, std::placeholders::_1)); //calls f(int)
std::for_each(vec.begin(), vec.end(), std::bind(g, std::placeholders::_1)); //calls g(int)
更方便,因为您可以根据需要保持花哨的回调并将其设置为适当的功能
std::function<void(int)> callback = std::bind(f, std::placeholders::_1);
if (userWantsG())
callback = std::bind(g, std::placeholders::_1);
std::for_each(vec.begin(), vec.end(), callback); //calls g or f