【发布时间】:2021-09-30 19:47:54
【问题描述】:
我正在使用 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] ) ;
}
【问题讨论】:
-
假设
vec中的数据像对应的数组一样存储(即int vec[3][3],这实际上并不能保证IIRC),那么您的复制将复制vec的所有九个元素进入三元素向量vec1。 -
用一个简单的
for循环来做你需要的事情有什么问题? -
这里有一些问题可以帮助您自己找到解决方案:
&vec[0][0]和&vec[2][2]的评估结果是什么?我的意思是类型,而不是值。基于这种类型,您认为copy()会如何处理它?你能把copy()翻译成一个循环吗?它会是什么样子?提取对角线的循环是什么样的? -
好吧,您可以编写一个自定义迭代器来沿对角线遍历矩阵并将其中的几个(开始和结束)提供给
std::copy,但我很有信心这是 不是你应该在这里做的,更不用说这将是一个比单个循环更复杂的数量级的任务。 -
@Some程序员老兄 一个简单的for循环没有错,但我想学习一点STL。我经常看到使用 STL 中的一些奇异算法而不是 for 循环的一行代码的答案,我认为我可以做类似的事情,但可能情况并非如此。
标签: c++ algorithm c++11 std stdvector