我认为问题在于指针
ptr
和新数组ptr2
的指针的比较。但我一点也不确定。
首先,我让用户输入一个 2D 数组,然后我通过其指针将数组转换为 Transpose,并且由于 C++ 中的数组实际上是行主要顺序的 1D 数组,所以我尝试只比较指针的值两个数组都指向。不知怎的,我不知道为什么,但它不起作用。我知道这可能不是最有效的方法,但我想学习并知道为什么它不起作用。
#include <iostream>
using namespace std;
bool transponierte(int *ptr, int groesse, int c, int r) {
bool symmetrisch;
int array_neu[r][c];
for (int i = 0; i < c; i++) {
for (int j = 0; j < r; j++) {
array_neu[j][i] = *ptr;
ptr++;
}
}
int *ptr2 = &array_neu[0][0];
for (int i = 0; i < groesse; i++) {
if (*ptr == *ptr2) {
symmetrisch = true;
}
if (*ptr != *ptr2) {
symmetrisch = false;
break;
}
ptr++;
ptr2++;
}
return symmetrisch;
}
int main() {
int r, c;
cout << "how many columns " << endl;
cin >> c;
cout << "how many rows " << endl;
cin >> r;
int array[c][r];
int groesse = r * c;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cout << "type in elemts for the array" << endl;
cin >> array[j][i];
}
}
bool trans = transponierte((int *)array, groesse, c, r);
if (trans == true) {
cout << "the matrix is not symmetric " << endl;
}
if (trans == false) {
cout << "the matrix is not symmetric" << endl;
}
return 0;
}
我期望这样的代码使用 std::vectorstd::vector
int array [c][r];
你的代码不是标准的C++
#include <cassert>
#include <vector>
#include <stdexcept>
class matrix_t
{
public:
matrix_t(const std::vector<std::vector<int>>&& values) :
m_values{values}
{
if ((m_values.size() == 0ul) || (m_values[0].size() == 0ul))
{
throw std::invalid_argument{"invalid matrix size"};
}
}
bool is_symmetric()
{
auto size = m_values.size();
// width and height match
if ( size == m_values[0].size())
{
// we only have to check values
// - not on diagonal (they always match)
// - in top-right of matrix (otherwise we will check values twice)
for(std::size_t row = 0; row < size; ++row)
{
for(std::size_t col = row + 1; col < size; ++col)
{
auto& value1 = m_values[col][row];
auto& value2 = m_values[row][col];
if ( value1 != value2 )
{
return false;
}
}
}
return true;
}
return false;
}
private:
std::vector<std::vector<int>> m_values;
};
int main()
{
matrix_t m1{{{1,0},{0,1}}};
assert(m1.is_symmetric());
matrix_t m2{{{1,0,2},{0,1,0},{2,0,1}}};
assert(m2.is_symmetric());
matrix_t m3{{{1,2,3},{0,1,0},{2,0,1}}};
assert(!m3.is_symmetric());
}