如何使用初始化列表循环来修改元素?
How to use initializer-list loops for modifying elements?
我可以使用初始化列表轻松模拟 for .. in
循环以进行读取访问
std::list<int> foo, bar, baz;
int main()
{
foo.push_back(3);
foo.push_back(2);
bar.push_back(1);
for (auto &x : {foo, bar, baz}) {
// x.push_back(42);
std::cout << x.size() << std::endl;
}
return 0;
}
这会打印:
2
1
0
我应该怎么做才能修改实际对象,就像注释行中一样:
// x.push_back(42);
我们从 C 中了解到的基于指针的技巧可以应用如下
for (auto x : { &foo, &bar, &baz }) {
x->push_back(42);
std::cout << x->size() << std::endl;
}
但是,这假设您确实想要使用 原始 对象,而不是它们的副本。 (您最初发布的代码实际上适用于副本。)
您可以使用 std::reference_wrapper
:
for (std::list<int>& x : {std::ref(foo), std::ref(bar), std::ref(baz)}) {
x.push_back(42);
std::cout << x.size() << std::endl;
}
我可以使用初始化列表轻松模拟 for .. in
循环以进行读取访问
std::list<int> foo, bar, baz;
int main()
{
foo.push_back(3);
foo.push_back(2);
bar.push_back(1);
for (auto &x : {foo, bar, baz}) {
// x.push_back(42);
std::cout << x.size() << std::endl;
}
return 0;
}
这会打印:
2
1
0
我应该怎么做才能修改实际对象,就像注释行中一样:
// x.push_back(42);
我们从 C 中了解到的基于指针的技巧可以应用如下
for (auto x : { &foo, &bar, &baz }) {
x->push_back(42);
std::cout << x->size() << std::endl;
}
但是,这假设您确实想要使用 原始 对象,而不是它们的副本。 (您最初发布的代码实际上适用于副本。)
您可以使用 std::reference_wrapper
:
for (std::list<int>& x : {std::ref(foo), std::ref(bar), std::ref(baz)}) {
x.push_back(42);
std::cout << x.size() << std::endl;
}