用于循环样式的C ++调用对象的特定成员函数

时间:2014-11-04 02:41:46

标签: c++ stl

迭代数组以调用每个元素的特定方法。

(a)中。索引样式

for(std::size_t i = 0; i < my_objs.size(); i++)
{
    my_objs[i].do_something();
}

(b)中。迭代器风格

for(std::vector<MyObject>::const_iterator iter = my_objs.begin();
    iter != my_objs.end(); iter++)
{
    iter->do_something();
}

(c)中。 STL风格

std::for_each(my_objs.begin(), my_objs.end(), [](const MyObject& obj){ obj.do_something(); });

(d)。 C ++ 11 for-loop风格

for(const auto& obj: my_objs)
{
    obj.do_something();
}

许多C ++书告诉我,尽可能使用STL。但是比较(c)到(d),STL样式for-loop需要额外的iterator pair和lambda的parameter type definition,以便std::for_each变得太长而无法轻松阅读。看起来(d)方式更清晰,类型更少。

哪一个具有更好的可读性?或者任何更好的样式来表示调用向量中每个对象的成员函数?

1 个答案:

答案 0 :(得分:1)

如果您有一个非常简单的任务,例如调用一个无效的成员函数,那么算法样式可能是合适的:

std::for_each(my_objs.cbegin(), my_objs.cend(),
              std::mem_fn(&MyObject::do_something));

否则可以随意使用基于范围的循环,这对于小型工作单元是完全可以接受的。当你发现任何一个街区做了太多工作时,一如既往地使用你的判断和重构。