我已经定义了一个由对和向量组成的向量。为了更好的可读性,我这样做
#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;
不起作用
答案 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;
(您改为使用地址,而您的代码段甚至无法编译)