2014-11-04 2 views
0

Я хочу, чтобы иметь возможность индексировать std :: vector, так что, когда я получаю доступ к данным через оператор [], индексный индекс равен нулю, а конец вектор верхний.Inherit from std :: vector и оператор перегрузки [] для пользовательской индексации

Это то, что я пытаюсь сделать. Не уверен, как это сделать на C++.

using namespace std; 

class Provider 
{ 
    public: string name; 
}; 

template <class T> 
class Vec : public std::vector<T> 
{ 
    private Vec(){} 
    public Vec(int upperbound, int lowerbound) 
    { 
     ub = upperbound; 
     lb = lowerbound; 
    } 

    public: 
     T& operator[] (int); 
    private: 
     int ub; 
     int lb; 
}; 

//How to do this? 
T& VecDQ::operator[] (int idx) 
{ 
    return (ub - lb) + idx; 
} 


int main() 
{ 
    int upperBound = 175642; 
    int lowerBound = 175000; 

    // I want a Vec of deques<Provider> index such that idx [0] is starting at lowerbound 
    Vec<std::deque<Provider>> vecOfDeq(upperBound, lowerBound); 

    //Here, fill the Vec<std::deque<Provider>> with some random examples 

    // Here, print out Vec[175000].at(1).name << std::endl; // Vec[175000] is really Vec[0] 

    return 0; 
} 
+0

'общественного общественного станд :: вектор ' общественности ... общественность? – Borgleader

+0

исправлено это была опечатка – Ivan

+1

Я не совсем понимаю, что вы пытаетесь сделать. У std :: vector уже есть реализация [] из STL, которая возвращает элемент в этом индексе, если он существует. Я не могу понять, какую функциональность вы пытаетесь достичь при перегрузке вашего оператора. – jzila

ответ

1

Есть некоторые опечатки в примере кода

//How to do this? 
T& VecDQ::operator[] (int idx) 
{ 
    return (ub - lb) + idx; 
} 

Здесь вы сообщаете компилятору, что вы определяете функцию operator[]-члены VecDQ класса. Вы не объявили класс VecDQ, я предполагаю, что вы имели в виду класс Vec. Помимо этого, определение должно быть внутри класса, поскольку у вас есть шаблонный шаблон, компилятор не знает, что такое «Т» вне шаблона.

Вот один Возможное определение:

T& operator[] (int idx) 
{ 
    return this->at(idx - lb); 
} 

at функция член вектора класса возвращает ссылку на элемент по этому индексу. Вам нужно вычесть нижнюю границу от указанного индекса.

Вам нужно будет решить, нужно ли изменять размер базового вектора динамически (когда указан новый индекс) или сделать это, когда построен производный класс Vec.

Вот ваша программа с изменением выше, с конструктором Vec, который предварительно выделяет базовый вектор с построенными по умолчанию элементами. Я также предоставил конструктору класс Provider, чтобы иметь возможность его построить либо с буквальными символьными строками, либо с std :: string.

http://coliru.stacked-crooked.com/a/40f5267799bc0f11

1
return *(begin() + lb + idx); 

или

return std::vector<T>::operator [](lb+idx); 

UpperBound довольно много бесполезной, если вы не хотите идти в петлях.

Кроме того, я должен согласиться с остальными, это кажется плохой идеей.

Смежные вопросы