提取矩阵的对角线
Extract diagonal of a matrix
我在学校练习使用 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] ) ;
}
您遇到分段错误的原因是您使用副本的方式,即您提供的参数无效。确实没有办法对角地遍历二维数组或向量(尽管如果您使用的是二维数组(而不是向量),您可以给它一个起点和终点对角线,但它只会复制所有内容之间,而不仅仅是对角线)。
我建议只使用 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]);
}
}
您没有标准 数组,其中数组的所有元素都连续存储。相反,你有一个 edge-vector array(维基百科称之为 Iliffe vector 虽然我从来没有听说过有人真的这么叫我自己)。因此,您的索引方法必须考虑到这一点。正如(在其他答案和评论中)指出的那样,无法使用仅在 单个容器 中工作的普通 迭代器 来做到这一点。 =13=]
(边向量数组是一个 锯齿状数组 ,其约束条件是指向的所有向量长度相同。)
您可以使用 分段迭代器 将其作为“单元”进行索引(如 "Segmented Iterators and Hierarchical Algorithms" (Austern) (pdf) 中所述,如果您愿意的话。但这需要完成很多工作对于大多数简单的用例,比如您描述的那个,一个简单的 for 循环就可以很好地完成(并且更容易理解和调试)。
我在学校练习使用 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] ) ;
}
您遇到分段错误的原因是您使用副本的方式,即您提供的参数无效。确实没有办法对角地遍历二维数组或向量(尽管如果您使用的是二维数组(而不是向量),您可以给它一个起点和终点对角线,但它只会复制所有内容之间,而不仅仅是对角线)。
我建议只使用 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]);
}
}
您没有标准 数组,其中数组的所有元素都连续存储。相反,你有一个 edge-vector array(维基百科称之为 Iliffe vector 虽然我从来没有听说过有人真的这么叫我自己)。因此,您的索引方法必须考虑到这一点。正如(在其他答案和评论中)指出的那样,无法使用仅在 单个容器 中工作的普通 迭代器 来做到这一点。 =13=]
(边向量数组是一个 锯齿状数组 ,其约束条件是指向的所有向量长度相同。)
您可以使用 分段迭代器 将其作为“单元”进行索引(如 "Segmented Iterators and Hierarchical Algorithms" (Austern) (pdf) 中所述,如果您愿意的话。但这需要完成很多工作对于大多数简单的用例,比如您描述的那个,一个简单的 for 循环就可以很好地完成(并且更容易理解和调试)。