试图将效果反映为对原始变量的更改(通过引用调用)

时间:2013-01-22 10:57:05

标签: c++ vector

我已经定义了一个由对和向量组成的向量。为了更好的可读性,我这样做

#include <iostream>
#include <vector>
using namespace std;
class foo {
public:
  vector< pair<int, vector<int> > > v;
  vector< pair<int, vector<int> > >::iterator it;
  void bar() 
  {
    for( it = v.begin(); it != v.end(); it++ ) {
      if ( 10 == (*it).first ) {
          vector<int> a = (*it).second;   // NOTE
          a[0] = a[0]*2;                  // NOTE
      }
    }
  }
};

int main()
{
  foo f;
  f.bar();
  return 0;
}

如您所见,我将(*it).second分配给变量a,以便我轻松操作。问题是,当我更改a的值时,原始向量v不会更改。我可以解决在循环中的每个位置将a更改为(*it).second的问题。但是这会使代码难以阅读。

有没有办法将a中的更改反映到原始v?我不得不说像这样的参考电话

vector<int> a = &(*it).second;

不起作用

3 个答案:

答案 0 :(得分:3)

您需要声明a作为参考:

vector<int>& a = (*it).second;

std::vector<int> a = &(*it).second;中的&符号被解析为adress-of运算符而a不是指针 - 这就是它无法工作/编译的原因。

答案 1 :(得分:2)

只有在将原始矢量引入参考时,才能更改原始矢量的值。 但是在您的代码中,您正在创建它的副本并更改不影响原始矢量的副本。

您的vector<int> a应该是参考。

vector<int> &a...

答案 2 :(得分:2)

首先:没有代码演示如何填充v成员以及初始化it时。毕竟确保你有一个有效的it(记住,在v修改之后,所有迭代器都可能无效)

和第二个:正确的行应该是这样的

vector<int>& a = it->second;

(您改为使用地址,而您的代码段甚至无法编译)