所有组合算法和解决C ++问题的一般方法

时间:2014-01-01 14:09:29

标签: c++

有没有人觉得他们在C ++方面已经超越了他们的深度,初学者,是的,我可以在21天内通过C ++工作,OO章节可以很小的比例。几年前我确实学习了VB6作为业余爱好的几年,但是当你开始进入任何大于微小tbh的代码库时,问题显然会出现。代码库越大,OO方面变得非常艰巨,试图与您实际所做的事情保持联系。

我在VB6中学到的另一个问题(在较小程度上)是总有多种方法来解决问题/算法,关键点是效率(速度+无错误代码)。在代码中共同破解解决方案是一回事,为更大的代码库编写复杂,高质量,智能,高效的代码是一个完全不同的野兽。也许我应该尝试使用c#/ VB?

以一个基本问题为例。

  1. 编写一个算法,输出给定字符集的每个组合,最多N个组合。说[0-9] [N = 3]所以 000 001 002 ... 111 112 113 ... 999
  2. 不是唯一的烫发,而是所有的梳子。

    正如我所说,必须有很多方法可以做到这一点,原始C和C ++样式与char数组,指针和递归,或使用SL或STL库中的一些功能,如动态数组/矢量/地图或模板以及SL / STL中可用的任何其他好东西,例如next_permutation等。

    除了使用数组这个问题的C风格算法本身就是一个令人费解的事实,然后你是否更加头痛是否使用其他库函数哪个是最有效的解决这个问题的方法。

    这是我非常讨厌的尝试,首先我不使用指针,然后我不能实现N个组合而不必使用多个凌乱的/ switch循环。

    所以我已经为[0-9]和这个组合的3个组合硬编码了,现在它确实在一定程度上工作,但最后它奇怪地跨越条件(显然)设置并添加另外10行组合。在这种情况下,'j'到10,其中j = 10在数组中是NULL,因此如此处所示的NULL空间。您将看到是否运行该程序。  00  01  02  03  04  05  06  07  08  09

    我还使用了全局变量,我想我应该使用指针代替?

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    void recurse_array(int N, char c_arr[]);
    
    int j = 0;
    int k = 0;
    int i = 0;
    ofstream myfile;
    
    int main()
    {
        int N;
        myfile.open("data.txt");
        cout << "Enter number N combos ";
        cin >> N;
        char c_arr[11] = "0123456789";
        recurse_array(N, c_arr);
    }
    
    void recurse_array(int N, char c_arr[])
    {
        for (i = 0; i < 10; i++) { // Why does sizeof not work when array is passed to function
            myfile << c_arr[j] << c_arr[k] << c_arr[i] << endl; //Expand << c_arr[x] to N times ??
        }
        while ((j < 10)) { // Why does j still = 10 at end for 10 more rows.
            if ((k == 9) && (i == 10)) { // why is i 10 and not 9????
                k = 0;
                j++;
                recurse_array(N, c_arr);
            } else {
                k++;
                recurse_array(N, c_arr);
            }
        }
    }
    

    因为你可以看到这只是3个连接的硬连线,之后我将不得不完全重做代码以添加更多组合。我只是看不出如何弄清楚这一点。我相信这是一个简单(优秀)优雅的解决方案。有些人天生就是C ++的人,我认为设计和方法论在编写代码时是成功的一半。 Pratice obvioulsy有点玩......

    有关如何处理问题的任何提示,以及解决上述特定算法的最佳方法。

2 个答案:

答案 0 :(得分:1)

我会这样做:

#include <iostream>
#include <vector>

bool increment(std::vector<int>& v, int maxSize)
{
    for (auto it = v.rbegin(); it != v.rend(); ++it) {
        ++*it;
        if (*it != maxSize) {
            return true;
        }
        *it = 0;
    }
    return false;
}

template <int N>
void display(const std::vector<int>& v, const char (&digits)[N])
{
    for (auto elem : v) {
        std::cout << digits[elem];
    }
    std::cout << std::endl;
}

template <int N>
void display_combinaison(int count, const char (&digits)[N])
{
    std::vector<int> v(count);

    do {
        display(v, digits);
    } while (increment(v, N - 1));
}

int main(int argc, char *argv[])
{
    display_combinaison(3, "0123456789");

    return 0;
}
  

为什么在将数组传递给函数

时sizeof不起作用

void function(int a[11])中,尺寸11会被忽略 它衰败到void function(int* a) 所以sizeof(a) == sizeof(int*)

传递固定大小数组的方法是

void function(int (&a)[11])

所以sizeof(a) == 11 * sizeof(int)。 (关心sizeof(int) != 1) 所以11 == sizeof(a) == sizeof(*a)

是通用的,您可以使用模板:

template <int N>
void function(int (&a)[N])

因此,它可以采用任何固定大小的数组。 请注意,我们有N,因此无需使用sizeof(a)

但是,最简单的方法是void function(int* a, unsigned int size)

答案 1 :(得分:0)

  

为什么在将数组传递给函数

时sizeof不起作用

c++ sizeof(array) return twice the array's declared length

  

为什么j仍然= 10,结尾10行。

您将j声明为全局并将其初始化为0然后仅在小于10时将其递增。在前10行之后它将为10并保持为10,因为您不更改它。也许你想让j成为recurse_array中的局部变量。

  

为什么我10而不是9 ????

你的for循环循环,而i&lt; 10.

for (i = 0; i < 10; i++) { // Why does sizeof not work when array is passed to function
    myfile << c_arr[j] << c_arr[k] << c_arr[i] << endl; //Expand << c_arr[x] to N times ??
}

循环完成后,我必须至少10才能退出循环。