首页 > 解决方案 > 将二维向量传递给类

问题描述

这是我尝试将任意元素类型、内部和外部长度的 ND 向量传递给类并打印其内容。我知道有一些问题,但我无法解决。如何将任意内部向量长度分配给一个变量或一组变量?我试图将迭代器传递给构造函数并将它们分配给成员变量(传递和不传递向量),但这并没有成功。我知道有一些用于处理矩阵对象和其他问题的库可以解决与此处提出的问题类似的问题,但是,有一些独特/边缘场景构成了这个问题的动机。

#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;


标签: c++multidimensional-arrayvectorstliterator

解决方案


使用迭代器的基本解决方案,如先前为 print 方法建议的那样。向量由 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;

推荐阅读