[C++] Creare una lista dato un input "cin >> n;"

di il
3 risposte

[C++] Creare una lista dato un input "cin >> n;"

Ciao a tutti!

sto scrivendo un programma per ordinare una sequenza secondo il metodo "merge sort" e vorrei chiedervi se qualcuno sa come si crea una lista dato un input n. Da quello che ho trovato in giro sembra essere impossibile siccome n non é una costante. La variabile n l'ho definita come int n; e da quello che ho capito dovrebbe essere una const int n; solo che a ogni ciclo devo creare una nuova lista di lunghezza n..

spero di essere stato chiaro..

la domanda per riassumere sarebbe: come cavolo creo questa lista di lunghezza n a ogni ciclo se n non é rilevata come costante ??

thxx
int main()
{
   int t;
   for(cin >> t; t > 0; --t)
   {
      cin >> n;
      list<int> numbers[n]; //QUI MI DA L'ERRORE
      for(int i = 0; i < n; ++i)
      {
         cin >> numbers;
      }

      mergesort(numbers, 0, n-1);
      
      cout << counter<< endl;
   }
   int end;
   cin >> end;
}

3 Risposte

  • Re: [C++] Creare una lista dato un input "cin >> n;"

    La std::list non ha bisogno che tu riservi dello spazio inizialmente. Volendo puoi usare std::list::resize ma non ne vedo l'utilità. Questo pezzo di codice può bastare:
    
    #include <iostream>
    #include <list>
    using namespace std;
    int main()
    {
    	list<int> numbers;
    	int n;
    	int value;
    	cin >> n;
    	for(int i = 0; i < n; ++i)
    	{
    		cin >> value;
    		numbers.push_back(value);
    	}
    }
    
  • Re: [C++] Creare una lista dato un input "cin >> n;"

    Ecco in questo modo funziona:
    // Mergesort.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int n;
    int counter = 0;
    
    void merge(vector<int> num, int left, int center, int right)
    {
    	vector<int> nr;
    	nr.resize(num.size());
    	int i, j;
    	for (i = center+1; i > left; i--)
    	{
    		nr[i] = num [i-1];
    		for (j = center; j < right; j++	)
    		{
    			//nr[right+center-j] = num [j+1];
    			nr[j] = num[j+1];
    			for(int m = left; m <= right; m++)
    			{
    				if (nr[j] < num [i])
    				{
    					num[m] = nr[j-1];
    					counter= counter+1;
    				}
    				else
    				{
    					num[m] = nr[j+1];
    					counter=counter+1;
    				}
    			}
    		}
    	}
    }
    
    static vector<int> mergesort(vector<int> num, int left, int right)
    {
    	if(right>left)
    	{
    		int center = (left+right)/2;
    		mergesort(num, left, center);
    		mergesort(num, center+1, right);
    		merge(num, left, center, right);
    	}
    	return num;
    }
    
    
    int main()
    {
    	// read input
    	int t;
    	int h;
    	for(cin >> t; t > 0; --t)
    	{
    		cin >> n;
    		vector<int> numbers; // create a vector containing the subsequence
    		for(int i = 0; i < n; i++)
    		{
    			cin >> h;
    			numbers.push_back(h);
    		}
    		// operations with the current sequence starts here:
    
    		numbers = mergesort(numbers, 0, n-1);
    	
    		//------Debug Process----------------------------
    		
    		cout << counter;
    		cout << " " ;
    		for (int z = 0; z < n; z++)
    		{
    			cout << numbers[z];
    			cout << " ";
    		}
    		cout << endl;
    	}
    	int end;
    	cin >> end;
    }
    
    
    il problema adesso é che non mi stampa la lista in ordine crescente...
  • Re: [C++] Creare una lista dato un input "cin >> n;"

    Hai inziato con le list per poi finire al vector. Cosa c'è che non va col ottima funzione std::sort presente nel header algorithm ?
Devi accedere o registrarti per scrivere nel forum
3 risposte