【问题标题】:How to use initializer-list loops for modifying elements?如何使用初始化列表循环来修改元素?
【发布时间】:2017-11-07 13:26:00
【问题描述】:

我可以使用初始化列表轻松模拟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++ initializer-list


【解决方案1】:

我们从 C 中知道的基于指针的技巧可以应用如下

  for (auto x : { &foo, &bar, &baz }) {
    x->push_back(42);
    std::cout << x->size() << std::endl;
  }

但是,这假定您实际上想要使用 原始 对象,而不是它们的副本。 (您最初发布的代码实际上适用于副本。)

【讨论】:

  • 这是一个好点!我很确定我正在使用原始对象
【解决方案2】:

你可以使用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;
}

【讨论】:

  • 我在看C++ reference。 std::reference_wrapper 在哪里调用? IE。那个工具是什么,它是如何工作的,它有什么作用等等?
猜你喜欢
  • 2021-07-04
  • 1970-01-01
  • 2018-12-22
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
相关资源
最近更新 更多