当我在 C++ 中只有对向量的引用时如何更改向量中的对象

Posted

技术标签:

【中文标题】当我在 C++ 中只有对向量的引用时如何更改向量中的对象【英文标题】:How to change the object in a vector when I only have a reference to the vector in c++ 【发布时间】:2021-02-16 11:18:41 【问题描述】:

我必须计算人们的平均年龄,然后我必须计算有多少人比平均年龄年轻。在那之后,我必须让他们变老,然后再次计算有多少人比平均水平年轻。

int magic(Vector<Person>& v, Guild g) 
  if (v.size() == 0) 
    throw runtime_error("");
  

  int d = accumulate(v.begin(), v.end(), 0,
                     [](int sum, Person p)  return sum += p.get_age(); );
  int a = d / v.size();
  auto count =
      count_if(v.begin(), v.end(), [a](Person p1)  return p1.get_age() < a; );

  for_each(v.begin(), v.end(), [g](Person p) 
    if (p.get_guild() == g) 
      return p.aging();
    
  );

  auto count2 =
      count_if(v.begin(), v.end(), [a](Person p3)  return p3.get_age() < a; );

  return count + count2;

【问题讨论】:

Person p n 你的 for_each lambda 是按值计算的。如果您要更改该对象,则需要引用 Person &amp;p。除此之外,考虑使用for (auto&amp; p : v) 并保护破旧的for_each 构造。 【参考方案1】:

您的 lambdas 按值接受它们的参数,这意味着您正在制作对象的副本并将它们传递给 lambdas。

修改副本不会改变向量中的原始值。

解决方案是通过引用获取参数。

int magic(Vector<Person>& v, Guild g) 
  if (v.size() == 0) 
    throw runtime_error("");
  

  // taking the Person by const-ref since we don't need to modify it
  int d = accumulate(v.begin(), v.end(), 0,
                     [](int sum, const Person& p)  return sum += p.get_age(); );
  int a = d / v.size();
  // again, const-ref
  auto count =
      count_if(v.begin(), v.end(), [a](const Person& p1)  return p1.get_age() < a; );

  // Here we take it by reference, so we can modify it.
  // Also capturing the Guild by reference to avoid uneccesary copy
  for_each(v.begin(), v.end(), [&g](Person& p) 
    if (p.get_guild() == g) 
      return p.aging();
    
  );

  // again by const-ref
  auto count2 =
      count_if(v.begin(), v.end(), [a](const Person& p3)  return p3.get_age() < a; );

  return count + count2;

【讨论】:

以上是关于当我在 C++ 中只有对向量的引用时如何更改向量中的对象的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中引用向量

在 C++ 中,如何获取指向向量的指针?

C++:试图理解通过引用传递向量

C++ 在向量中存储对类成员的引用

C++ 向量通过引用语法传递

通过引用传递向量,但更改不会坚持 c++