gpt4 book ai didi

c++ - 如何在 C++ 中提取二维数组的列?

转载 作者:行者123 更新时间:2023-11-27 23:38:33 26 4
gpt4 key购买 nike

我的任务是计算每个元素在相应行 i 和列 j 中大于元素 aij 的元素数C++中的二维数组。我的方法是提取第 ith 行和第 jth 列,对它们进行排序并使用计数器变量遍历排序的数组,直到 ij 元素被发现。

但问题在于为每个这样的元素提取整行i 和整列j。我知道可以使用 C++ 中的 std::copy 函数轻松提取该行。

int **adj=new int *[n];

for(r=0;r<m;r++)
for(c=0;c<n;c++)
cin>>adj[r][c];

int buf[n];
std::copy(adj[i], adj[i] + n, buf);

但是如何提取对应的第j列呢?

我可以使用类似这样的循环结构轻松地做到这一点:

int buf[m];
for(r=0;r<m;r++)
buf[r]=adj[r][j];

但这会增加时间复杂度,请记住,数组的每个元素都需要执行此操作。有更好的方法吗?

最佳答案

如果你决定用C++写程序,那么

  • 停止使用普通的 C 风格数组。 C 样式数组没有任何理由。永远不要再使用它们。简单地停止它。
  • 停止使用原始指针。现在和永远。不要使用原始指针
  • 不要使用新的。从不
  • 您要使用的语言 C++ 不支持 VLA(可变长度数组),首先不要使用 C 样式数组,也不要使用 VLA(如 int buf[m];
  • 特别是,如果您不了解它们的工作原理,请不要使用此类结构

在你的第一行,你正在写

int **adj=new int *[n];

这样你就分配了一个指针数组。这些指针未初始化。它们指向内存中的某个随机位置。

for(r=0;r<m;r++)
for(c=0;c<n;c++)
cin>>adj[r][c];

您正在获取用户输入并将它们写入随机内存,有些是未定义的,会破坏堆并导致崩溃。

int buf[n];
std::copy(adj[i], adj[i] + n, buf);

您将一些随机值复制到 buf 中。它看起来会有效。但这只是偶然。

将来请使用std::vectorstd array(如果您在编译时知道维度)。对于二维数组,使用 vector 的 vector 。

请看下面的例子:

int main()
{
const size_t numberOfRows = 3;
const size_t numberOfColumns = 4;

std::vector<std::vector<int>> a2d(numberOfRows, std::vector<int>(numberOfColumns));

// Fill a2d with data
for (size_t row = 0; row < a2d.size(); ++row) {
for (size_t col = 0; col < a2d.front().size(); ++col) {
std::cin >> a2d[row][col];
}
}

// Get 2nd row
std::vector<int> row(numberOfColumns);
std::copy(a2d[1].begin(), a2d[1].end(), row.begin());

return 0;
}

关于c++ - 如何在 C++ 中提取二维数组的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57337588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com