假设我有一个从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] 删除。
我来说两句