有没有更优雅的方式在C ++ 11中执行以下操作?

时间:2015-02-02 17:07:55

标签: c++ c++11

我想避免关于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
}

在这种情况下,我没有得到警告。但我想知道是否有更优雅的东西,它会自动推断出迭代器所需的类型。

4 个答案:

答案 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_typesize_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