提取矩阵的对角线

时间:2021-07-23 17:51:34

标签: c++ algorithm c++11 std stdvector

我正在学校使用 C++ 的 std 进行锻炼,我想找到一种方法来使用 std::copy 提取矩阵的对角线。这就是我提出的,但它给了我一个分段错误错误。我究竟做错了什么?是否有更多的 C++ 方法可以在不使用 for 循环的情况下做到这一点? 谢谢

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

int main () {

    std::vector<std::vector<int>> vec {{1,2,3},{3,4,5},{1,6,7} ;
    std::vector<int> vec1{0,0,0} ; 
    std::copy ( &vec[0][0], &vec[2][2], &vec1[0] ) ;

}


2 个答案:

答案 0 :(得分:2)

您收到分段错误的原因是您使用复制的方式,您提供了无效参数。没有真正的方法可以对角地遍历 2D 数组或向量(尽管如果您使用的是 2D 数组(不是向量),您可以给它一个彼此对角线的起点和终点,但它只会复制所有内容之间,而不仅仅是对角线)。

我建议只使用 for 循环,这没有什么问题。 (即使有一些令人费解的方法来让复制工作,for 循环已经足够清晰和足够快了)。

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

int main () {

    std::vector<std::vector<int>> vec {{1,2,3},{3,4,5},{1,6,7}} ;
    // std::vector<int> vec1{0,0,0} ; 
    // std::copy ( &vec[0][0], &vec[2][2], &vec1[0] ) ;

    std::vector<int> diagonal;
    for(uint i=0;i<vec.size();i++){
        diagonal.push_back(vec[i][i]);
    }
    
}

答案 1 :(得分:0)

您没有标准的数组,其中数组的所有元素连续存储。相反,您有一个边向量数组(维基百科称其为 Iliffe vector,尽管我自己从未听过有人真正称其为)。因此,您的索引方法必须考虑到这一点。正如(在其他答案和评论中)指出的那样,普通的迭代器无法做到这一点,它只能在单个容器中工作。

(边向量数组是一个锯齿状数组,约束条件是所有指向的向量长度相同。) Jagged array, image from Wikipedia

您可以使用分段迭代器将其作为一个“单元”进行索引(如果您愿意,如"Segmented Iterators and Hierarchical Algorithms" (Austern) (pdf)中所述。但对于大多数简单用例来说,这需要做很多工作,就像你描述的那样,一个简单的 for 循环就可以了(并且更容易理解和调试)。

相关问题