我写了以下代码:
#include <iostream>
#include <vector>
#include <iomanip>
using std::cin; using std::cout; using std::endl;
int DivideTwoFactorials(int m, int n)
{
int div(1);
while (m > n)
{
div *= m;
m--;
}
return div;
}
int Factorial(int m)
{
int fact(1);
for (int i(1); i <=m; i++) fact *= i;
return fact;
}
int BinomialCoefficient(int m, int n)
{
return (DivideTwoFactorials(m, n) * (1./Factorial(m-n)));
}
template <typename Type>
void Modify3DContainer(Type &a, int fun(int, int), int p = 0, int q = 0)
{
int m(a.size());
int n(a[0].size());
int z(a[0][0].size());
for (int i(0); i < m; i++)
{
for (int j(0); j < n; j++)
{
for (int k(0); k < z; k++)
{
if (a[i][j][k] == fun(p, q)) a[i][j][k] = a[i][j][k] * a[i][j][k];
}
}
}
}
int main()
{
cout << endl << "Input dimensions of 3D container: ";
int m, n, p;
cin >> m >> n >> p;
std::vector<std::vector<std::vector<int>>> a(m, std::vector<std::vector<int>>(n, std::vector<int>(p)));
cout << endl << "Input elements of 3D container: ";
int x;
for (int i(0); i < m; i++)
{
for (int j(0); j < n; j++)
{
for (int k(0); k < p; k++)
{
cin >> x;
a[i][j][k] = x;
}
}
}
Modify3DContainer(a, BinomialCoefficient, 6, 4);
cout << endl << "Modified 3D container: " << endl << endl;
for (int i(0); i < m; i++)
{
for (int j(0); j < n; j++)
{
for (int k(0); k < p; k++)
{
cout << std::setw(6) << a[i][j][k];
}
cout << endl;
}
cout << endl;
}
return 0;
}
关于“Modify3DContainer”函数有一个问题,它接受以下参数:
当该函数接收p和q作为参数时,该函数应该找到3D容器中与第二个参数定义的函数的返回值相等的所有元素,并用它们的平方值替换这些元素。 这里的问题是函数“Modify3DContainer”接受多种类型的容器,我不允许将容器的维度传递给所述函数(c ++编程赋值)。该函数目前仅适用于使用size()方法的向量向量的向量,但它不适用于常规数组。我尝试使用sizeof运算符,但它不适用于多维向量。使用typeid检查容器的类型可能是一种可能的解决方案,但有许多组合需要检查,因为3D容器可以是例如deques等向量的向量。
所以我的问题是,有没有办法找到传递过的3D容器的大小,无论其类型如何?
谢谢。
答案 0 :(得分:1)
如果您真的想知道尺寸,那么您要找的是std::size
。它会告诉你传递给它的任何东西的大小,它是一个原始数组或一个具有size
成员函数的对象。不幸的是,它是一个C ++ 17功能,所以你可能没有在你正在使用的编译器中使用它。
幸运的是,它的机制已经存在于当前标准中,因此我们可以编写自己的内容,就像上一个链接提供的可能实现一样
template <class C> constexpr auto size(const C& c) -> decltype(c.size()) { return c.size(); } template <class T, std::size_t N> constexpr auto size(const T (&array)[N]) noexcept { return N; }
在
中使用它们int main()
{
std::vector<std::vector<std::vector<int>>> vec(10, std::vector<std::vector<int>>(20, std::vector<int>(30, 0)));
int arr[10][20][30];
std::cout << size(vec) << "\t" << size(arr) << "\n";
std::cout << size(vec[0]) << "\t" << size(arr[0]) << "\n";
std::cout << size(vec[0][0]) << "\t" << size(arr[0][0]) << "\n";
return 0;
}
我们得到了
10 10
20 20
30 30
如果您不需要大小但只需要循环,那么您可以使用range based for loop或常规循环并使用std::begin
和std::end
,它们适用于容器和数组。< / p>