Передача 2-D вектора в класс - PullRequest
0 голосов
/ 26 февраля 2020

Это моя попытка передать вектор ND произвольных типов элементов , внутренней и внешней длины в класс и распечатать его содержимое. Я знаю, что есть несколько вопросов, но я не смог их решить. Как бы я назначил произвольную длину внутреннего вектора переменной или набору переменных? Я попытался передать итераторы конструктору и назначить их переменным-членам (с передачей вектора и без нее), но это не увенчалось успехом. Я понимаю, что есть библиотеки для работы с матричными объектами и другие вопросы, которые решают проблемы, аналогичные тем, которые были поставлены здесь, однако, существуют уникальные / незначительные сценарии ios, которые составляют мотивы для этого вопроса.

#include <iostream>
#include <iterator>
#include <vector>

template <typename V, typename I>
class myVec{
    private:
        I rows;
        I cols;
        std::vector< std::vector<V> > vec( rows , vector<int> (cols));

    public:
        myVec(std::vector< std::vector<V> > const &myArr){
            vec = myArr;
            rows = myArr.size();
            cols = myArr[].size();
        }
        void printVec(){
            for(int i = 0; i < vec.size(); i++){
                std::cout << "{";
                for(int j = 0; j < vec[i].size(); j++){
                    std::cout << vec[i][j];
                }
                if (i < vec.size()){ 
                    std::cout << "}";
                    if (i < vec.size()-1){
                        std::cout << ",";
                        std::cout << " ";
                    }
                }
            }
            std::cout << std::endl;
        }
};

int main () {
    std::vector< std::vector<int> > mainVec = {{1, 2, 4}, {5, 6, 7, 8}, {4, 3, 2, 1, 7}, {8, 7, 6, 5, 9, 3}};
    myVec<int, int> vec1 = myVec<int, int>(mainVec); 
    vec1.printVec();
    return 0;


1 Ответ

0 голосов
/ 27 февраля 2020

Базовое c решение, которое использует итераторы, как ранее предлагалось для метода печати. Вектор передается с помощью const ref. Насколько выгодно вместо этого использовать Move assign? Перегрузки оператора индекса и методы доступа в настоящее время не включены, планируется включить обработку исключений за пределами и в других случаях.

#include <iostream>
#include <vector>

template <typename V>
class myVec{
    private:
        std::vector< std::vector<V> > vec;

    public:
        myVec();
        explicit myVec(const std::vector< std::vector<V> > &myArr):vec(myArr) {};
        explicit myVec(std::vector< std::vector<V> > &&myArr):vec(std::move(myArr)) {};
        }
        void printVec(){
            std::cout << '{';
            for(auto& row:vec){
                if(&row != &vec.front()) std::cout << ", "; 
                std::cout << '{';
                if(auto cln = row.begin(); cln != row.end()) {
                    std::cout << *cln;
                    for(++cln; cln != row.end(); ++cln) std::cout << ", " << *cln;
                }
                std::cout << '}';
            }
            std::cout << '}' << std::endl;
        }
};

int main () {
    std::vector< std::vector<int> > mainVec = {{1, 2, 4}, {5, 6, 7, 8}, {4, 3, 2, 1, 7}, {8, 7, 6, 5, 9, 3}};
    myVec<int, int> vec1 = myVec<int, int>(mainVec); 
    vec1.printVec();
    return 0;
...