c++ - 将数字放入不同的堆中

标签 c++ vector deque

我有一排数字,我想把它堆成一堆。它的放置方式是你看堆(它们应该总是按大小排序),如果你发现一堆数字小于你放在堆前面的那堆中的第一个数字;如果它比堆中的最后一个数字大,则将其放在堆的后面。如果以上都不是真的,你就重新堆起来。例如:

输入:

2 5 4 3 4 5 7 6 5 0 // 0 is used for end of input

输出:

3 4 5 7
2 5 6
4 5

程序编译并运行,但不是它应该的方式(不同的结果)。代码如下:

#include <iostream>
#include <deque>
#include <vector>
using namespace std;
  void sort_by_size( vector<deque<int>>& container )
   {
     for(int i=0;i<container.size();i++ )
      for(int j=i;j<container.size();j++)
        if(container.at(i).size()<container.at(j).size())
            swap(container.at(i),container.at(j));
   }
int main()
{
  int n;
  vector<int> all_dishes;
  while(n!=0)
   {
     cin>>n;
     if(n!=0)
     all_dishes.push_back(n);
   }
  vector<deque<int>> piles ;

  for(int i=0;i<all_dishes.size();i++)
  {
    sort_by_size(piles);
    bool smaller = false;
    bool greater = false;
    for(int j=0;j<piles.size();j++)
    {
        if(all_dishes.at(i)<*piles.at(j).begin())
        {
            piles.at(j).push_front(all_dishes.at(i));
            smaller = true;
            break;
        }

        if(all_dishes.at(i)>*piles.at(j).end())
        {
            piles.at(j).push_back(all_dishes.at(i));
            greater = true;
            break;
        }

    }

    if ( smaller==false && greater==false )
    {
        deque<int> temp;
        temp.push_back(all_dishes.at(i));
        piles.push_back(temp);
    }
    /*cout<<i<<":"<<endl;
    for(int i=0;i<piles.size();i++)
    {
        for(int j=0;j<piles.at(i).size();j++)
          {
            cout<<piles.at(i).at(j)<<" ";
          }
    cout<<endl;
    }*/ //for looking what happens at each iteration
}

  for(int i =0;i<piles.size();i++)
   {
      for(int j=0;j<piles.at(i).size();j++)
       {
        cout<<piles.at(i).at(j)<<" ";
       }
    cout<<endl;
   }
  return 0;
}

知道算法有什么问题以及如何解决吗?

最佳答案

你有几个问题。

首先,您的n 变量没有初始化。这应该会触发编译器错误。

其次,您尝试从 end() 迭代器中取消引用该元素。这是不可能的,因为它指向序列末尾之后的那个,所以 end() 不可取消引用。你应该使用 back()

换句话说,这个

if(all_dishes.at(i)>*piles.at(j).end())

应该变成这样:

if(all_dishes.at(i) > piles.at(j).back())

通过这些更改,您的程序会输出预期的结果。

关于c++ - 将数字放入不同的堆中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27696020/

相关文章:

c++ - 如何正确地将指向 blob 的 void 指针转换为结构指针?

c++ - 函数参数 : Copy or pointer?

android - 用于android人脸识别的openCV显示 "mat not continuous"错误

c++ - 计算搜索比较 C++

c++ - 双端队列推回错误

c++ - 使用模板模板参数的模板参数

c++ - 如何获得指向 std::vector 中第一个元素的指针?

vector - VHDL 直接比较向量

c++ - 如何在 std::deque 中避免 `deque iterator not dereferencable`?锁?

Java添加到队列的前面-deque