2

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

#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;

不工作

4

3 回答 3

3

您需要声明a为参考:

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

与号instd::vector<int> a = &(*it).second;被解析为地址运算符,a而不是指针 - 这就是它不起作用/编译的原因。

于 2013-01-22T10:58:34.243 回答
2

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

vector<int> a应该是一个参考。

vector<int> &a...
于 2013-01-22T11:01:11.837 回答
2

首先:没有代码可以演示如何填充v成员以及何时初始化it. 只需确保您it毕竟有一个有效的(请记住,向量中的所有迭代器都可能在v修改后失效)

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

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

(您取而代之的是一个地址,您的代码段甚至无法编译)

于 2013-01-22T11:02:28.300 回答