我有:
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
?
怎么做,谢谢!
答案 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。