Универсальный вектор векторов в C++

Существует ли хороший путь в C++ для реализации (или фальшивка) типа для универсального вектора векторов?

Проигнорируйте проблему того, когда вектор векторов является хорошей идеей (если нет что-то эквивалентное, которое всегда лучше). Предположите, что это действительно точно моделирует проблему, и что матрица точно не моделирует проблему. Предположите также, что обработал по шаблону функции, берущие эти вещи, поскольку параметры действительно должны управлять структурой (например, звонящий push_back), таким образом, они не могут только взять универсальную поддержку типа [][].

То, что я хочу сделать:

template<typename T>
typedef vector< vector<T> > vecvec;

vecvec<int> intSequences;
vecvec<string> stringSequences;

но конечно это не возможно, так как определение типа не может быть шаблонным.

#define vecvec(T) vector< vector<T> >

близко, и сохранил бы дублирование типа через каждую шаблонную функцию, которая воздействует на vecvecs, но не была бы популярна у большинства программистов на C++.

49
задан Steve Jessop 16 November 2008 в 05:26
поделиться

1 ответ

Вы можете реализовать базовый тип вектор-вектор, используя std :: vector в качестве основы:

#include <iostream>
#include <ostream>
#include <vector>
using namespace std;

template <typename T>
struct vecvec
{
    typedef vector<T> value_type;
    typedef vector<value_type> type;
    typedef typename type::size_type size_type;
    typedef typename type::reference reference;
    typedef typename type::const_reference const_reference;

    vecvec(size_type first, size_type second)
        : v_(first, value_type(second, T()))
    {}

    reference operator[](size_type n)
    { return v_[n]; }

    const_reference operator[](size_type n) const
    { return v_[n]; }

    size_type first_size() const
    { return v_.size(); }

    size_type second_size() const
    { return v_.empty() ? 0 : v_[0].size(); }

    // TODO: replicate std::vector interface if needed, like
    //iterator begin();
    //iterator end();

private:
    type v_;

};

// for convenient printing only
template <typename T> 
ostream& operator<<(ostream& os, vecvec<T> const& v)
{
    typedef vecvec<T> v_t;
    typedef typename v_t::value_type vv_t;
    for (typename v_t::size_type i = 0; i < v.first_size(); ++i)
    {
        for (typename vv_t::size_type j = 0; j < v.second_size(); ++j)
        {
            os << v[i][j] << '\t';
        }
        os << endl;
    }
    return os;
}

int main()
{
    vecvec<int> v(2, 3);
    cout << v.first_size() << " x " << v.second_size() << endl;
    cout << v << endl;

    v[0][0] = 1; v[0][1] = 3; v[0][2] = 5;
    v[1][0] = 2; v[1][1] = 4; v[1][2] = 6;
    cout << v << endl;
}

Это просто очень простой контейнер, который имитирует матрицу (пока пользователь обещает, путем улучшения определения vecvec или правильного использования, прямоугольной формы).

2
ответ дан 7 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: