这个函数和lambda有什么区别?

时间:2017-04-02 02:21:53

标签: c++ lambda

import java.util.Scanner;

public class RotateMatrix
{
    static int rows = 0;
    static int cols = 0;

    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        Scanner scan = new Scanner(System.in);
        rows = scan.nextInt();
        cols = scan.nextInt();
        int rots = scan.nextInt();
        int[][] matrix = new int[rows][cols];
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                matrix[i][j] = scan.nextInt();
            }
        }
        for (int i = 0; i < rots; i++)
            rotate(matrix, 0, rows - 1, 0, cols - 1);

        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println();
        }
        scan.close();
    }

    public static int[][] rotate(int[][] arr, int rowStart, int rowEnd, int colStart, int colEnd)
    {

        if (rowStart == rowEnd && colStart == colEnd)
        {
            return arr;
        }
        if (rowStart > rowEnd || colStart > colEnd)
        {
            return arr;
        }

        int temp = arr[rowStart][colStart];
        for (int j = colStart; j < colEnd; j++)
        {
            arr[colStart][j] = arr[colStart][j + 1];
        }
        for (int i = rowStart; i < rowEnd; i++)
        {
            arr[i][colEnd] = arr[i + 1][colEnd];
        }
        for (int i = colEnd; i > colStart; i--)
        {
            arr[rowEnd][i] = arr[rowEnd][i - 1];
        }
        for (int i = rowEnd; i > rowStart; i--)
        {
            arr[i][colStart] = arr[i - 1][colStart];
        }

        if (rows == 1)
        {
            arr[colEnd][rowStart] = temp;
        }
        else
            arr[rowStart + 1][colStart] = temp;

        System.out.println("-----------------------------------------\n");
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println("-----------------------------------------\n");
        rotate(arr, rowStart + 1, rowEnd - 1, colStart + 1, colEnd - 1);
        return arr;
    }
}

我很喜欢C ++,我遇到上面的情况,我已经回顾了C ++ Primer的10.3.2到10.3.3章节,其中介绍了lambda表达式。但它对我不起作用,我是也对我列出的最后一个注释感到困惑。

2 个答案:

答案 0 :(得分:2)

return []() { return *(new int(666)); };

这一行试图返回lambda本身。你想调用 lambda并返回它产生的整数:

return []() { return *(new int(666)); }();  // Note the () at the end

但是,定义lambda函数通常没有多大意义,只能立即调用它。当你需要实际返回一个函数或者将一个函数作为参数时,它们会更常用。 (但这是一个更高级的事情,所以你现在可能不应该担心它。)

单独注意:您的程序使用new分配整数,但它永远不会使用delete释放它们。这是一个memory leak,这是你应该避免的。

答案 1 :(得分:0)

Actuall,我没有调用我的lambda,因为它没有调用操作符。 所以,我把它解决为:

return []() { return *(new int(666)); }();

现在有效。

我回顾了C ++ Primer 10.3.2章节中的单词“我们称呼lambda的方式与调用函数的方式相同”。