Ссылка на внутренний индекс? - PullRequest
1 голос
/ 11 февраля 2011

Предположим, у меня есть

vector<vector<int> > a;

, который индексируется как

a[i][j] = stuff;

где я "внешний" и j "внутренний" ...

Тогда создать ссылку на «внешний» вектор очень просто:

vector<int>& b = a[x];

Есть ли хороший способ создать ссылку на внутреннее?

vector<int>& b = a[<don't know>][x];

Спасибо.

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Эта строка:

vector<int>& b = a[x];

- это не ссылка на внешний вектор, а один из внутренних векторов. Также обратите внимание, что возможно множество внутренних векторов.

Вот как получить ссылку на внешний вектор (хотя в целом это было бы бессмысленно):

vector<vector<int> > &outer = a;

Получение ссылки на один из внутренних векторов выглядит примерно так:

vector<int> &inner = a[x];
1 голос
/ 11 февраля 2011

К сожалению, нет, прямого способа создания такой ссылки нет, потому что компилятор обрабатывает это как

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 векторов, и, вероятно,хотите параметризовать всю структуру в зависимости от типа хранимых элементов.Я не уверен, что это то, что вы ищете, но это как минимум показывает, что в принципе вы можете получить желаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...