使用C ++列表库作为链接列表

时间:2014-02-18 18:06:03

标签: c++ list linked-list

我正在尝试使用C ++列表库制作一个简单的seq程序

当我使用第一级时,我的程序运行正常,但是,由于某种原因,它在所有其他级别之后崩溃。

我使用visual studio作为编译器。我尝试了调试器模式以及资源。 程序在资源模式下不会崩溃,但它不会给我偶数级别的输出。另外,由于某种原因,它给出了一半的赔率水平。

我想解决这个问题,我希望它也能在dubgger模式下工作。

有什么建议吗?

这是我到目前为止所做的事情

  class RULLZ: public list<Fraction>
  {
    private:
    list<Fraction>::iterator head,tail,buf,buf1;
    public :
      Farey2()
    {
      this->push_front( Fraction(1,1));
      this->push_front( Fraction(0,1));

}

  void Add(int level)

  {
    Fraction *tmp,*tmp2;
    buf=this->first();
    for(int i=0;i<level-1;i++)  
    {


      head=this->first();
      tail=this->last();
      while(head!=tail)
      {

        tmp=new Fraction(head->num,head->den);
        head++;
        if(tmp->den+head->den<=level)
        {
          tmp2=new Fraction(tmp->num+head->num,tmp->den+head->den);
          this->insert(head,*tmp2); 
          head--;
        }


      }
      this->pop_back();
    }





  }

  friend ostream& operator<<(ostream& out,  RULLZ& f)
  {
    for(list<Fraction>::iterator it=f.first();it !=f.last();it++)
      out <<*it;
    return out;
  }

  };

1 个答案:

答案 0 :(得分:0)

class RULLZ: public list<Fraction>

在查看您的问题之前,上面的代码是个问题。 C ++标准容器故意设计为基类(它们都没有虚拟析构函数),因此这会导致问题。由于您不应公开从标准容器派生的原因,请参阅以下内容:

  1. When is it "okay"?
  2. The risks
  3. Why it is a bad design decision
  4. Coding Guidelines (Page ~60)
  5. Why inheritance is usually not the right approach
  6. 您似乎希望Add函数将下一个X个分数添加到一起(如果我理解您的意图正确)。更好的方法是使用std::stack

    std::stack<Fraction, std::list<Fraction>> expression;
    // add fractions to your stack here
    Fraction Add(unsigned int count)
    {
        // assume count is greater than 1 (as adding 0 fractions makes no sense, and adding 1 is trivial)
        Fraction result(0, 1);
        for (int i = 0; i < count; ++i)
        {
            Fraction a = expression.top();
            expression.pop();
            Fraction b = expression.top();
            expression.pop();
            result += a + b; // assume operators + and += have been implemented for Fraction
        }
        expression.push(result);
        return result;
    }
    

    您似乎遇到的另一个问题是逻辑问题(假设我正确理解您的意图):

    for(int i=0;i<level-1;i++)
    

    如果level是您要添加的分数数,并且您传入2,则此循环将仅包含第一个分数。也就是说,它不会添加分数0和1,而只是抓住分数0并返回它。我认为你的意思是

    for(int i=0; i < level; i++)
    

    这将抓住两个分数0和1加起来。

    我不确定在哪里,但是您生成该系列的逻辑似乎已关闭。可以找到一种更简单的方法here

    #include <algorithm>
    #include <cstdint>
    #include <iterator>
    #include <iostream>
    #include <vector>
    
    struct Fraction
    {
        std::uint32_t Numerator;
        std::uint32_t Denominator;
        Fraction(std::uint32_t n, std::uint32_t d) : Numerator(n), Denominator(d) { }
    };
    
    std::ostream& operator<<(std::ostream& os, const Fraction& f)
    {
        os << "(" << f.Numerator << " / " << f.Denominator << ")";
        return os;
    }
    
    typedef std::vector<Fraction> FareySeries;
    
    FareySeries generate_series(std::uint32_t depth)
    {
        std::uint32_t a = 0;
        std::uint32_t b = 1;
        std::uint32_t c = 1;
        std::uint32_t d = depth;
        FareySeries results;
        results.emplace_back(a, b);
        while (c <= depth)
        {
            std::uint32_t k = (depth + b) / d;
            std::uint32_t nc = (k * c) - a;
            std::uint32_t nd = (k * d) - b;
            a = c;
            b = d;
            c = nc;
            d = nd;
            results.emplace_back(a, b);
        }
        return results;
    }
    
    int main()
    {
        const std::uint32_t DEPTH = 4;
        FareySeries series = generate_series(DEPTH);
        std::copy(series.begin(), series.end(), std::ostream_iterator<Fraction>(std::cout, "\n"));
        return 0;
    }