查找通过引用

时间:2016-10-03 16:09:09

标签: c++ arrays vector

我写了以下代码:

#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”函数有一个问题,它接受以下参数:

  • 3D容器的参考
  • 一个返回int并接收两个int参数的函数
  • 两个int参数,默认值为0。

当该函数接收p和q作为参数时,该函数应该找到3D容器中与第二个参数定义的函数的返回值相等的所有元素,并用它们的平方值替换这些元素。 这里的问题是函数“Modify3DContainer”接受多种类型的容器,我不允许将容器的维度传递给所述函数(c ++编程赋值)。该函数目前仅适用于使用size()方法的向量向量的向量,但它不适用于常规数组。我尝试使用sizeof运算符,但它不适用于多维向量。使用typeid检查容器的类型可能是一种可能的解决方案,但有许多组合需要检查,因为3D容器可以是例如deques等向量的向量。

所以我的问题是,有没有办法找到传递过的3D容器的大小,无论其类型如何?

谢谢。

1 个答案:

答案 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

Live Example

如果您不需要大小但只需要循环,那么您可以使用range based for loop或常规循环并使用std::beginstd::end,它们适用于容器和数组。< / p>