vector wyświetlanie od końca

0

Witam,
Chciałem za pomocą kontenera wczytać n ilość liczb i odwrócić tą tablicę. Wyświetla ładnie, gorzej z odwrotnym wyświetlaniem.

#include <iostream>
#include <vector>

using namespace std;

int main()
{
   vector <int> tab;
   int x;

   while(std::cin>>x)
      tab.push_back( x );

//    for( unsigned int i = 0; i < tab.size(); i++ )
//         cout << tab[i] << " ";

    for( unsigned int i=tab.size(); i >= 0; i--)
        cout << tab[i] << " ";

    return 0;
}
 
4

http://www.cplusplus.com/reference/algorithm/reverse/
jak chcesz tylko wyświetlić to użyj reverse iterator:

for (vector<int>::reverse_iterator it = tab.rbegin(); it != tab.rend(); ++it)
{
  cout << *it << " ";
}

Jak koniecznie chcesz użyć swojego kodu to:
for (int i = tab.size() - 1; i >= 0; i--)
elementy mają indeksy od 0 do N-1
jak użyjesz unsigned int to warunek i >= 0 zawsze będzie spełniony i będziesz mieć nieskończoną pętlę.

Albo możesz wrzucać na stos i potem z niego wywalać to samo się odwróci :D

0

Ale głupota :) dzięki bardzo. A tak z ciekawości.. Jak zrobić to samo tylko w C? Chodzi mi konkretnie o wczytanie nieznanej ilości liczb.

3

Tak samo jak to robi vector: alokuje najpierw pamięć na jakąś niewielką liczbę elementów (8, albo 16) a jak się zapełnią, to alokuje więcej miejsca (np. poprzedni rozmiar razy 2), kopiuje tam dotychczasowe elementy, a stary obszar zwalnia.
Tylko że w C to musisz sobie napisać samemu, albo użyć jakiejś gotowej zewnętrznej biblioteki.

1

Kiedyś widziałem brzydkie ale bardzo sprytne rozwiązanie:

#include <iostream>
using namespace std;

struct DoubleTab { unsigned size; double *tb; };

DoubleTab make(unsigned size)
  {
   DoubleTab dt;
   dt.size=size;
   dt.tb=(double*)malloc(size*sizeof(double));
   return dt;
  }
  
DoubleTab set(DoubleTab dt,unsigned pos,double value)
  {
   dt.tb[pos]=value;
   return dt;
  }

DoubleTab read(unsigned size)
  {
   double value;
   return (scanf("%lf",&value)==1)?set(read(size+1),size,value):make(size);
  }

void drop(DoubleTab dt)
  {
   free(dt.tb);
  }
       
int main()
  {
   DoubleTab dt;
   printf("Po zakonczeniu wprowadzenia wpisz znak !\n");
   dt=read(0);
   for(unsigned i=0;i<dt.size;++i) printf("%lf\t",dt.tb[i]);
   drop(dt);
   return 0;
  }
0

nie lepiej użyć std::deque i pakowac elementy od przodu?

http://ideone.com/X796T8

1 użytkowników online, w tym zalogowanych: 0, gości: 1