注册 登录
编程论坛 C++教室

基于c++模板写一个组合算法问题

花脸 发布于 2018-12-03 22:03, 1827 次点击
运行结果为什么输出的前两个值为0,调试的时候查看没有向vector中存放0,
求指教,下面附上代码。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

template <class T>
class Combine
{
    public:
        void combine(vector<T> a,vector<T> &result,typename vector<T>::iterator begin,int num);
};

template <class T>
void Combine<T>::combine(vector<T> a,vector<T>& r,typename vector<T>::iterator begin,int num)
{
    if(a.size()==0)
    {
        cout<<" 要组合的数组为空."<<endl;
        return;
    }
   
    if(num==0)
    {
        for_each(r.begin(),r.end(),[](T i)
            {
                cout<<i<<" ";
            });
        cout<<endl;
    }
   
    r.push_back(*begin);
    combine(a,r,++begin,num-1);
    r.pop_back();
    combine(a,r,++begin,num);
}

int main()
{
    vector<int> a;
    int n;
    cout<<" 请输入元素的个数:"<<endl;
    cin>>n;
    for(int i=0;i<n;++i)
    {
        int t;
        cin>>t;
        a.push_back(t);
    }
   
    int num;
    cout<<" 请输入要选择的个数:"<<endl;
    cin>>num;
    Combine<int> c;
    vector<int> r(num,0);
    (a,r,a.begin(),num);
    return 0;
}
只有本站会员才能查看附件,请 登录
5 回复
#2
rohalloway2018-12-04 02:09
Combine类的构造函数中的第二个参数vector<T> &result

这里你使用的是vector<int> r的引用,

你在main函数中定义的vector<int> r(num,0);

这种定义是声明一个向量r,并初始化为num个0



在控制台中,输入选择的个数时,你填的2,
所以num=2,vector<int> r的内容是0,0


Combine类的构造函数的参数是引用,
所以运行之后vector<int> r的内容是 0,0,1,2,3



vector<int> r(num,0);改成vector<int> r; 试试
#3
花脸2018-12-04 12:33
回复 2楼 rohalloway
改完之后也不行。。。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2018-12-4 12:35编辑过]

#4
Jonny02012018-12-04 22:34
这种异常的输出想都不用想就是越界了
一步一步调试看看哪里越界了
还有, 你那个算法我实在看不懂什么意思
#5
花脸2018-12-05 15:45
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

template <class T>
class Combine
{
    public:
        void combine(vector<T> a,int begin,int num);
    private:
        vector<T> r;
};

template <class T>
void Combine<T>::combine(vector<T> a,int begin,int num)
{
    if(a.empty())
    {
        cout<<" 要组合的数组为空."<<endl;
        return;
    }
    if(num==0)
    {
        for_each(r.begin(),r.end(),[](T i)
        {
            cout<<i<<" ";
        });
        cout<<endl;
        return;
    }
    for(int i=begin;i<a.size();++i)
    {
        r.push_back(a.at(i));
        combine(a,i+1,num-1);
        r.pop_back();
    }
}

int main()
{
    vector<int> a;
    int n;
    cout<<" 请输入元素的个数:"<<endl;
    cin>>n;
    for(int i=0;i<n;++i)
    {
        int t;
        cin>>t;
        a.push_back(t);
    }
   
    int num;
    cout<<" 请输入要选择的个数:"<<endl;
    cin>>num;
    Combine<int> c;
    (a,0,num);
    return 0;
}
#6
花脸2018-12-05 15:45
回复 4楼 Jonny0201
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

template <class T>
class Combine
{
    public:
        void combine(vector<T> a,int begin,int num);
    private:
        vector<T> r;
};

template <class T>
void Combine<T>::combine(vector<T> a,int begin,int num)
{
    if(a.empty())
    {
        cout<<" 要组合的数组为空."<<endl;
        return;
    }
    if(num==0)
    {
        for_each(r.begin(),r.end(),[](T i)
        {
            cout<<i<<" ";
        });
        cout<<endl;
        return;
    }
    for(int i=begin;i<a.size();++i)
    {
        r.push_back(a.at(i));
        combine(a,i+1,num-1);
        r.pop_back();
    }
}

int main()
{
    vector<int> a;
    int n;
    cout<<" 请输入元素的个数:"<<endl;
    cin>>n;
    for(int i=0;i<n;++i)
    {
        int t;
        cin>>t;
        a.push_back(t);
    }
   
    int num;
    cout<<" 请输入要选择的个数:"<<endl;
    cin>>num;
    Combine<int> c;
    (a,0,num);
    return 0;
}
1