在C ++中迭代2D容器的最干净方法

丁格杜普

假设我有一个从2D容器接收开始和结束迭代器的函数。我想获取容器的尺寸,然后使用以下指定的格式遍历元素:

template <typename It>
void func(It st, It en) {
  int rows = ... , cols = ... ;
  for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
      // get container's index somehow using indices
    }
  }
}

int main() {
  int arr[2][3] = {{0, 1, 2}, {3, 4, 5}};
  func(arr, arr + 2 * 3);
}

是否可以使用迭代器来实现?

鲍勃__

假设我有一个从2D容器接收开始和结束迭代器的函数。

这是第一个问题。在发布的代码段中有以下几行:

int arr[2][3] = {{0, 1, 2}, {3, 4, 5}};
func(arr, arr + 2 * 3);
//            ^^^^^^^   

虽然arr通常称为多维或2D数组,但实际上它是2个3整数数组的数组。它的大小不是6(= 2x3),而是2。

如果要在函数签名中使用两个迭代器,则可以按照以下方式重写函数:

// This would print out the elements
template <typename RandomIt>
void func(RandomIt first, RandomIt last)
{
    // Iterates through the rows
    for (auto row = first; row < last; ++row)
    {
        // Loops through each row
        for (auto const& el : *row)
        {
            std::cout << ' ' << el;
        }
        std::cout << '\n';
    }
}

int main()
{
    int arr[2][3] = {{0, 1, 2}, {3, 4, 5}};
    func(std::cbegin(arr), std::cend(arr));
    std::cout << '\n';

    std::vector<std::vector<int>> b {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
    func(b.cbegin(), b.cend());
}

我想得到容器的尺寸

有几种方法可以完成此操作。

如果将自己限制为纯数组,则可以更改函数签名并使用正确的模板参数,然后按引用传递数组:

template <class T, std::size_t Rows, std::size_t Cols>
void func(T const (&arr)[Rows][Cols]) { /* ... */ }

标准库提供了各种免费功能,可以帮助编写更多通用功能,例如std::size

template <class M>
void func(M const& m)
{
    for (size_t i{}; i < std::size(m); ++i)
    {
        for (size_t j{}; j < std::size(m[i]); ++j)
        {
            std::cout << ' ' << m[i][j];
        }
        std::cout << '\n';
    }
}

通常,您可以创建自己的类来为2D容器建模,并编写返回正确行数或列数的访问器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++中2D向量的迭代

来自分类Dev

Rust vs C中2D阵列性能的迭代

来自分类Dev

C ++模板中条件代码实例化的最干净方法

来自分类Dev

在c ++ 11中进行相对时间比较的最干净的方法

来自分类Dev

在C中初始化指针的最干净方法是什么?

来自分类Dev

在c ++ 11中,最现代的方法,最迭代向量的最“正确”方法是什么

来自分类Dev

在c中释放双指针的干净方法

来自分类Dev

自从在C ++中执行以来,最干净,最简单的方法来获取经过时间

来自分类Dev

C中的快速2D卷积

来自分类Dev

C ++中的2D数组

来自分类Dev

C中的2D数组指针

来自分类Dev

C ++中的2D矢量问题

来自分类Dev

在C中初始化2D / 3D数组的简便方法?

来自分类Dev

在C / C ++中传递2d数组时出错

来自分类Dev

在Perl / C / C ++中声明2D坐标

来自分类Dev

C#检查2D数组中的任何元素是NaN还是Infinity的最佳方法

来自分类Dev

在C ++中复制2D向量一维的最快方法

来自分类Dev

在C ++中复制2D向量一维的最快方法

来自分类Dev

[C++][std::sort] 它如何在 2D 容器上工作?

来自分类Dev

C-1D和2D中的指针

来自分类Dev

在函数中传递2d数组-从C中的函数返回2d数组

来自分类Dev

迭代超过一个序列。C ++ 11中的容器

来自分类Dev

访问2D阵列的正确方法-C

来自分类Dev

嵌套通用容器迭代C ++

来自分类Dev

嵌套通用容器迭代C ++

来自分类Dev

C中结构(2d数组)的静态成员(2d数组)

来自分类Dev

在C中交换2d数组(指向指针的指针)

来自分类Dev

将2d数组传递给C ++中的函数

来自分类Dev

如何在C ++中清除2D矢量