标题:基于c++模板写一个组合算法问题
只看楼主
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
已结贴  问题点数:20 回复次数:5 
基于c++模板写一个组合算法问题
运行结果为什么输出的前两个值为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;
}
搜索更多相关主题的帖子: vector begin int num cout 
2018-12-03 22:03
rohalloway
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:97
专家分:405
注 册:2018-9-28
得分:20 
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; 试试
2018-12-04 02:09
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 2楼 rohalloway
改完之后也不行。。。


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

2018-12-04 12:33
Jonny0201
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:52
帖 子:488
专家分:2603
注 册:2016-11-7
得分:0 
这种异常的输出想都不用想就是越界了
一步一步调试看看哪里越界了
还有, 你那个算法我实在看不懂什么意思
2018-12-04 22:34
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
#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;
}
2018-12-05 15:45
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 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;
}
2018-12-05 15:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-491802-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.118107 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved