通过更改其指针在c ++中工作来修改向量?

时间:2017-06-21 20:06:15

标签: c++ pointers reference stl

以下是代码段,我想将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

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

2 个答案:

答案 0 :(得分:2)

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

modify(&first);

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

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

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

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

答案 1 :(得分:0)

看起来你想要这个:

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

它已经老了&#34;通过参数修改值的方法可能有问题:

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

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