введите вектор и boost :: numeric :: ublas :: vector фиксированного размера - PullRequest
0 голосов
/ 12 марта 2019

Я имею в виду 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 и итераторов (например, this ).Я хочу избежать этого.

Вопрос 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;
};

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

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

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

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

0 голосов
/ 12 марта 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;
}
...