继承自std :: vector <t>并重载operator []以进行自定义索引</t>

时间:2014-11-04 19:18:42

标签: c++ std

我希望能够索引一个std :: vector,这样当我通过operator []访问数据时,索引零是下限,而矢量的结尾是上限。

这就是我想要做的。不知道怎么用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;
}

2 个答案:

答案 0 :(得分:1)

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

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

upperbound几乎没用,除非你想进入循环。

另外,我必须同意其他人,这似乎是一个坏主意。

答案 1 :(得分:1)

您的示例代码中存在一些拼写错误

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

在这里,您告诉编译器您正在定义operator[]类的VecDQ成员函数。你还没有声明VecDQ类,我假设你的意思是Vec。除此之外,定义应该在类中,因为你有一个模板化的类,编译器不会知道模板化类之外的“T”。

这是一个可行的定义:

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

vector类的at成员函数返回对该索引处的项的引用。您需要从给定的索引中减去下限。

您需要决定是否动态调整基本向量(当给出新索引时)或者是否在构造Vec派生类时执行此操作。

这是你的程序,上面有一个改变,有一个Vec构造函数,它预先分配了带有默认构造元素的基础向量。我还为Provider类提供了一个构造函数,以便能够使用文字字符串或std :: string构造它。

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