如何使用std算法替换for循环?

时间:2013-11-29 12:31:37

标签: c++ algorithm

我有:

struct A
{
    int index;

    A(): index(0) {}
}
std::vector<A> ManyAs(10, A());

想做:

for (int i = 0, size = ManyAs.size(); i < size; ++i)
{
    ManyAs[i].index = i;
}

我想用std算法做这个,也许是std::for_each

怎么做,谢谢!

4 个答案:

答案 0 :(得分:3)

我会采取以下方式

struct A
{
    int index;

    A(): index(0) {}
    A & operator =( int i )
    {
        index = i;
        return ( *this );
    }
};

std::iota( ManyAs.begin(), ManyAs.end(), 0 );

答案 1 :(得分:2)

在这种特殊情况下,我会保留代码。当您想要将相同的操作应用于范围的所有元素时,最好使用标准库算法。但是在这里,您实际上并没有应用相同的操作,因为您为每个元素的索引分配了不同的数字。因此,基于计数器的for循环似乎是最自然的解决方案。

但是,如果您真的想使用标准算法,可以使用有状态仿函数:

struct Functor
{
  size_t index;
  Functor() : index(0) {}
  void operator() (A &a) { a.index = index++; }
};

std::for_each(ManyAs.begin(), ManyAs.end(), Functor());

答案 2 :(得分:1)

以下是两种方法:

struct my_functor
{
    my_functor()
        : i(0)
    {
    }
    void operator () (A & a)
    {
        a.index = i++;
    }
    int i;
};
void foo();
{
    //old c++ style
    std::for_each(ManyAs.begin(), ManyAs.end(), my_functor());
}

第二

//c++11
int i = 0;
std::for_each(ManyAs.begin(), ManyAs.end(), [&](A & a){ a.index = i++; });

答案 3 :(得分:0)

不知怎的,我找到了理想的答案:

std::for_each(ManyAs.begin(), ManyAs.end(),
    [&](A& a)
    {
        int offset=(&a) - (&ManyAs.front());
        a.index = offset;
    });

实际上它与Raxvan的答案非常相似,但一切都是本地的,这是更好的imo。