typedef вектор и boost::numeric::ublas::vector фиксированного размера

Я имею в виду typedef имя для вектора/вектора повышения с фиксированным размером, а затем для соответствующих итераторов. Что я мог сделать, так это (см. ниже)

typedef std::array<double, 3> point_3d_array;
typedef point_3d_array::iterator point_3d_iterator;
typedef point_3d_array::const_iterator point_3d_const_iterator;

Идея состоит в том, чтобы использовать позже в моем коде что-то вроде

point_3d_array p;
for ( point_3d_const_iterator it = p.begin() ; it != p.end() ; it++ ) {
   my code
}

Вопрос 1. Возможно ли это с помощью

  1. std::vector<double>

  2. boost::numeric::ublas::vector<double>?

Если это невозможно:

  1. Вопрос 2. Что такое альтернативная реализация? (кроме приведенного ниже).

  2. Вопрос 3. Как мне typedef использовать итераторы?

На данный момент, поскольку я не мог найти способ сделать это, я определил свой собственный класс (см. ниже). Но это несет бремя (по крайней мере) необходимости переопределять мои собственные begin, end и итераторы (например, это). Я имею в виду, чтобы избежать этого.

Вопрос 4. Я соединил две альтернативные строки в определении operator+= (см. ниже). Один из них не работает. В чем проблема?

typedef std::array<double, 3> point_3d_array;
typedef point_3d_array::iterator point_3d_iterator;
typedef point_3d_array::const_iterator point_3d_const_iterator;

class point_3d {
public:
    /*
     * Default constructor
     */
    point_3d() : _point_3d({ 0, 0, 0 }) { };
    /*
     * Initialization constructor
     * Is copy constructor automatically generated?
     */
    point_3d(const double x1, const double x2, const double x3) : _point_3d({x1, x2, x3}) {};

    /*
     * Iterator members
     */
    point_3d_iterator begin() { return _point_3d.begin(); }
    point_3d_iterator end() { return _point_3d.end(); }
    point_3d_const_iterator begin() const { return _point_3d.begin(); }
    point_3d_const_iterator end() const { return _point_3d.end(); }
    /*
     * Array subscript operators
     */
    double & operator[](size_t i) {
        return this->_point_3d[ i ];
    }
    const double & operator[](size_t i) const {
        return this->_point_3d[ i ];
    }

    /*
     * Basic operation members
     */
    point_3d & operator+=(const point_3d &rhs) {
        for ( size_t i = 0 ; i < this->_point_3d.size() ; i++ ) {
            //this[ i ] += rhs[ i ];  // Why are Array subscript operators not working in the lhs?
            this->_point_3d[ i ] += rhs[ i ];
        }
        return *this;
    }

private:
    point_3d_array _point_3d;
};

person sancho.s ReinstateMonicaCellio    schedule 12.03.2019    source источник
comment
typedef итераторам не нужен фиксированный размер.   -  person apple apple    schedule 12.03.2019


Ответы (2)


Ни std::vector, ни (на момент написания) boost::numeric::ublas::vector разработаны для фиксированного размера. Нет параметра шаблона, указывающего размер контейнера.

Так что нет, фиксированный размер typedef не имеет смысла для этих контейнеров.

Если вы хотите ограничить размер std::vector, то одним из подходов будет написание собственного класса шаблона с std::vector для моделирования полезной нагрузки.

person Bathsheba    schedule 12.03.2019
comment
Пожалуйста, смотрите обновленный ОП. Я делаю вывод (как я сначала подумал), что ответ на Q1 — нет. Единственным вариантом был бы новый класс, как я сделал (почему класс-шаблон?), поэтому ответ на вопрос 2 будет заключаться в том, что другой альтернативы нет. И все же я должен решить Q4. - person sancho.s ReinstateMonicaCellio; 12.03.2019

boost::numeric::ublas имеет контейнер хранения фиксированного размера и вектор фиксированного размера. Я не уверен, что вам нужно использоватьtypedef для типов итераторов и векторных типов. Вот небольшой пример, как использовать оба типа и смешивать их даже с std::array или std::vector.

#include <boost/numeric/ublas/storage.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <array>
#include <numeric>

using namespace boost::numeric;
using value_t = float;

int main () {
    constexpr auto N = 5ul;
    auto a = ublas::bounded_array<value_t,N>{N};
    auto b = ublas::fixed_vector<value_t,N>{};
    auto c = std::array<value_t,N>{};

    auto print = [](auto n, auto v){
        std::cout << n << "= "; 
        std::copy(v.begin(), v.end(), std::ostream_iterator<value_t>(std::cout, " ")); 
        std::cout << std::endl;
    };

    std::iota(a.begin(), a.end(), value_t(1));
    std::iota(b.begin(), b.end(), value_t(1));
    std::transform(a.begin(), a.end(), b.begin(), c.begin(), [](auto const& aa, auto const& bb){return aa+bb;});

    auto d = 2*b + b;

    print("a",a);
    print("b",b);
    print("c",c);
    print("d",d);
    return 0;
}
person Cem Bassoy    schedule 12.03.2019