假设我有
vector<vector<int> > a;
,索引为
a[i][j] = stuff;
其中我是“外部”而j是“内部”......
然后创建对“外部”向量的引用很容易:
vector<int>& b = a[x];
有没有一种很好的方法来创建对内部的引用?
vector<int>& b = a[<don't know>][x];
感谢。
答案 0 :(得分:1)
不幸的是,不,没有直接的方法来创建这样的引用,因为编译器正在对此进行处理
a.operator[] (/* ... don't know ... */).operator[] (x);
只有在operator []
的第一次电话实际回复vector
时才有意义。
但是,您可以通过引入专门处理行为的新类来伪造此行为。我们的想法是让这个类存储第二个索引,并提供一个operator[]
函数,在给定第一个索引的情况下,查找vector
中的实际值。这是一个例子:
class IndexReverser { // Or, your favorite name
public:
IndexReverser(vector< vector<int> >& v, size_t index);
int& operator[] (size_t firstIndex);
private:
vector< vector<int> >& realVector;
const size_t secondIndex;
};
IndexReverser::IndexReverser(vector< vector<int> >&v,
size_t index) : realVector(v), secondIndex(index) {
// Handled in initialization list
}
int& IndexReverser::operator[] (size_t firstIndex) {
return realVector[firstIndex][secondIndex];
}
然后你可以写下这个:
IndexReverser ir(a, j);
ir[i] = 137;
您可能需要提供一个双类来处理const
向量,并且可能希望参数化存储元素类型的整个结构。我不确定这是否是您正在寻找的,但它至少表明原则上您可以获得您想要的行为。
答案 1 :(得分:1)
这一行:
vector<int>& b = a[x];
不是对外部向量的引用,而是内部向量之一。另请注意,可能存在许多内部向量。
以下是如何获取外部向量的引用(尽管通常它没有意义):
vector<vector<int> > &outer = a;
获取对其中一个内部向量的引用看起来像这样:
vector<int> &inner = a[x];