我正在尝试旋转chars向量的向量。
我进行了二维矢量矩阵设置。现在,矩阵从文件中获取输入,我使用vector.push_back(c)
将字符添加到vvc;
vvc数组的一个例子就是这样
aaaaa
azzza
azaza
azzza
azaaa
azaaa
azaaa
aaaaa
我有vvc设置,但是我试图将其旋转90度。我将其逆时针旋转90度,但我需要将其顺时针旋转90度。
截至目前,我的代码已完成
90 counter clock
aaaaaaaa
azzzzzza
azazaaaa
azzzaaaa
aaaaaaaa
,并通过此循环完成;
cout <<"\n90 counter clock"<<endl;
for (size_t colNo = 0; colNo < kvsize2; colNo++)
{
for (const auto &row : twovector)
{
char colVal = row.at(colNo);
cout << colVal;
}
cout << endl;
}
我只是在学习向量及其范围。尝试执行递减循环几乎可以工作,但总是让我陷入段错状态。
“已解决” 我在用
twovector.push_back(temp);
使用
twovector.insert(twovector.begin(),temp);
给我
90 counter clock
aaaaaaaa
azzzzzza
aaaazaza
aaaazzza
aaaaaaaa
答案 0 :(得分:1)
如果我说对了,而您想要做的就是顺时针打印90度矩阵,请尝试以下代码:
for (int colNo = 0; colNo < vec[0].size(); colNo++)
{
for (int i = vec.size() - 1; i >= 0; i--)
{
const auto& row = vec[i];
int colVal = row.at(colNo);
cout << colVal;
}
cout << endl;
}
答案 1 :(得分:1)
解决问题的特定部分:
如果有人对如何旋转M * N 2d向量数组有任何提示或建议
C ++善于从数据中分离算法。
请注意,答案有点冗长,目的是为了教程。
让我们开始吧!
我们希望从rotate_2d_matrix_clockwise
算法中获得3个功能:
int
,char
,double
或任何用户定义的类型。std::array
和std::vector
rotate_2d_matrix_clockwise
返回的结果调用rotate_2d_matrix_clockwise
,以实现2次轮换。一旦我们明确了要求,就可以为算法起草一些用例。
std::vector<std::vector<char>> data = { {'a', 'b', 'c', 'd'},
{'e', 'f', 'g', 'h'},
{'i', 'j', 'k', 'l'} };
rotate_2d_matrix_clockwise(data); // rotating 2d-matrix of vector<char>
std::array<std::array<int, 4>, 3> data2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
// rotating 2d-matrix of array<int>, twice
rotate_2d_matrix_clockwise(rotate_2d_matrix_clockwise(data2)));
因此,让我们使用一些模板来创建通用的2d顺时针旋转功能。
我们的rotate_2d_matrix_clockwise
将:
original_matrix
并返回一个新的rotated_matrix
。 rotated_matrix
并将其传递给助手功能rotate_2d_matrix_clockwise_impl
,在该功能中将完成实际工作。那么rotate_2d_matrix_clockwise
的{{1}}的实现将如何?
std::array
整洁而精确。
template<typename T, size_t M, size_t N>
auto rotate_2d_matrix_clockwise(std::array<std::array<T, M>, N> const & original_matrix)
-> std::array<std::array<T, N>, M>
{
std::array<std::array<T, N>, M> rotated_matrix;
rotate_2d_matrix_clockwise_impl(original_matrix, rotated_matrix, M, N); // rotate
return rotated_matrix;
}
的{{1}}的实现有点混乱。
rotate_2d_matrix_clockwise
现在让我们看一下实际旋转算法std::vector
的外观。
应该注意的是,该算法与容器和/或所包含的数据无关。它只是专注于旋转。
template<typename Matrix2D>
auto rotate_2d_matrix_clockwise(Matrix2D const & original_matrix) -> Matrix2D
{
int const M = original_matrix[0].size(); // deduce M and N
int const N = original_matrix.size();
Matrix2D rotated_matrix; // vector has no form, hence we have to resize it for `N x M`
rotated_matrix.resize(M);
for (auto x = 0; x < M; ++x) {
rotated_matrix[x].resize(N);
}
rotate_2d_matrix_clockwise_impl(original_matrix, rotated_matrix, M, N); // rotate
return rotated_matrix;
}
这是一个用C ++ 11编译的完整示例。
rotate_2d_matrix_clockwise_impl