【问题标题】:Modify a vector by changing its pointer doesn't work in c++?通过更改其指针来修改向量在 C++ 中不起作用?
【发布时间】:2017-11-24 21:42:29
【问题描述】:

下面是sn-p,我想将first变量指向second变量而不复制向量:

#include <iostream>
#include <vector>

std::vector<int> second (4,100);
void modify(std::vector<int>* i) {
  i = &second;
}
int main ()
{
  std::vector<int> first;                                // empty vector of ints
  modify(&first);
  for (std::vector<int>::iterator it = first.begin(); it != first.end(); ++it)
    std::cout << ' ' << *it;

  std::cout << '\n';

  return 0;
}

输出为空,而我预计输出为100 100 100 100

有人知道为什么我不能像这样修改矢量吗?

【问题讨论】:

  • 你能以同样的方式“修改”int吗?也许它与向量无关?

标签: c++ pointers reference stl


【解决方案1】:

看起来你想要这个:

void modify(std::vector<int>* i) {
  *i = second;
}

这是通过参数修改值的“旧”方式,它可能存在问题:

void modify(std::vector<int>* i) {
  if( !i ) {
      // what should I do?
      throw std::runtime_exception( "cannot modify vector through nullptr" );
  }
  *i = second;
}

可以使用引用来避免这种额外的检查,这也可以让代码的读者更清楚你的意图,除非你真的想传递nullptr 有时出于某种原因(告诉函数不要改变值,但做一些事情否则例如)。

【讨论】:

    【解决方案2】:

    您正在按值传递指针。这意味着您在函数中更改指针指向的任何内容都不会在函数外部看到。如果您想查看调用站点中的更改,您需要做的是通过引用传递指针。这在这种情况下不起作用,因为

    modify(&first);
    

    是一个右值指针,不能绑定到非 const 左值引用。

    所有这些都不是必需的。我们可以改变函数来获取像

    这样的引用
    void modify(std::vector<int>& i) {
      i = second;
    }
    

    然后modify(&amp;first); 变为modify(first);,现在更改将反映在main() 中。

    【讨论】:

    • 谢谢!这是按值复制还是按引用复制?
    • @HanfeiSun 我的建议是通过引用而不是按值指针传递。
    • @HanfeiSun 称为通过引用传递。如果你想这样称呼它,副本总是“按价值”
    猜你喜欢
    • 1970-01-01
    • 2018-09-08
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多