Wczytywanie określonej liczby liczb z ciągu zawartego w kodzie do tablicy, wektora lub listy.

0

Witam!

Czy istnieje możliwość wczytania określonej liczby liczb z ciągu zawartego w kodzie programu? Mam na przykład zbiór {1, 3, 7, 4, 5, 252, 6524, 5245, 524} (docelowo ma tam być 1000 elementów). Chcę wczytać do listy pierwsze trzy elementy, czyli {1, 3, 7}. Zawsze wczytujemy od pierwszego. Jak to zrobić?

0

Pętlą.

0

Dzięki za odpowiedź, ale jak pętlą? Niezbyt wiele mi to powiedziało :(

0

Zakładam, że ciąg masz w jakiejś tablicy bądź vectorze. Tworzysz sobie nową listę i po prostu dodajesz 3 elementy. Jeśli zawsze są to trzy pierwsze elementy, to nawet pętli nie musisz używać.

list<int>lista;
lista.push_back(tab[0]);
lista.push_back(tab[1]);
lista.push_back(tab[2]);

Natomiast, jeśli chcesz wczytać n liczb, to już pętli należy użyć:

list<int>lista;
    int n;
    cin>>n;
    for(int i=0;i<n;++i)
        lista.push_back(tab[i]);

    for(list<int>::iterator it=lista.begin(); it!=lista.end();it++)
        cout<<*it<<" ";
    cout<<endl;
0

Obojętne którą np for

for(vector<int>::iterator i = iv.begin(); i != iv.end(); ++i)
      cout << *i << endl;
// lub bez iteratora
for(int i = 0; i < iv.size(); ++i)
      cout << iv[i] << endl;
0

Oj, coś takiego to ja umiem zrobić, ale po co tworzyć wektor 1000 elementów, z których użyję np. sześć. Chodzi o to, żeby niepotrzebnie nie zajmować pamięci. Jak właduję na początek wektor 1000 liczb, to nie będzie to zbyt oszczędne. Chodzi mi o to, żeby te liczby "przechowywane" były w kodzie, a nie w pamięci. Wiesz już, o co mi chodzi?

0
merlinnot napisał(a)

Oj, coś takiego to ja umiem zrobić, ale po co tworzyć wektor 1000 elementów, z których użyję np. sześć. Chodzi o to, żeby niepotrzebnie nie zajmować pamięci. Jak właduję na początek wektor 1000 liczb, to nie będzie to zbyt oszczędne. Chodzi mi o to, żeby te liczby "przechowywane" były w kodzie, a nie w pamięci. Wiesz już, o co mi chodzi?

Tablica dynamiczna lub wektor służą do tworzenia tablic (lub kontenerów ściśle mówiąc, jak vector), których ilość elementów z góry nie jest znana.

0

To po prostu wrzuć te liczby do pliku, nie będą zajmowały pamięci.
Jeżeli zamieściłbyś te liczby w kodzie, to program zajmowałby więcej miejsca w pamięci mimo wszystko.

0

Przepraszam za kodowaną herezję, ale może zrozumiecie, o co mi chodzi:

cin >> ilosc; /*wczytuję ilość liczb, które mają być wczytane do tablicy*/
int tab[ilosc] = {1, 2, 3, 4, 5, 6, 7, 8, 9} /* Dla ilosc=3 wczytuję do tablicy {1, 2, 3}, dla 6 {1, 2, 3, 4, 5, 6} itd. */ 
 

Wiem, że mógłbym od razu wczytać tablicę 1000 elementów i wypisać z niej kilka do listy, pytanie tylko: po co? Chciałbym od razu stworzyć tablicę kilku elementów, żeby oszczędzić pamięć.

0

O to chodzi?

cin >> ilosc;
std::vector<int> tab(ilosc);
for(int i=1; i<=ilosc; i++)
   tab.at(i-1)=i;
0

No to twórz tablicę tylko dla danej ilości elementów i te elementy wyliczaj. Myślisz, że jak wklepiesz w kodzie n liczb to one miejsca nie zajmują? Przecież cały program i tak jest ładowany do pamięci. Już nie mówiąc o tym, że kod wynikowy ma niewiele wspólnego z tym co Ty zakodzisz.

W skrócie: to co chcesz zrobić to jest jakaś bzdura, kompletny bez sens i brak zrozumienia co tak naprawdę się dookoła dzieje.

0
merlinnot napisał(a)

Przepraszam za kodowaną herezję, ale może zrozumiecie, o co mi chodzi:

cin >> ilosc; /*wczytuję ilość liczb, które mają być wczytane do tablicy*/
int tab[ilosc] = {1, 2, 3, 4, 5, 6, 7, 8, 9} /* Dla ilosc=3 wczytuję do tablicy {1, 2, 3}, dla 6 {1, 2, 3, 4, 5, 6} itd. */ 
 

Wiem, że mógłbym od razu wczytać tablicę 1000 elementów i wypisać z niej kilka do listy, pytanie tylko: po co? Chciałbym od razu stworzyć tablicę kilku elementów, żeby oszczędzić pamięć.

Tak się nie powinno tworzyć tablic, mimo tego, ze można.
Użyj tablicy dynamicznej:

int n;
int* tab = new int[n];

Po czym wczytujesz tyle elementów ile potrzebujesz i zwalniasz pamięć. Możesz też zrobić tak, jak MJay napisał - trzymać liczby w pliku.

0

Dobra, jak się nie da, to się nie da. Wiem, że liczby w kodzie zajmowałyby pamięć, ale jak jeszcze wpisałbym je do tablicy, to zajmowałyby jej jeszcze więcej. Trudno :( Dzięki za zainteresowanie.

0

1000 elementów to dużo wg. Ciebie? To ile byś chciał, żeby zajmowały?

0

Jeżeli piszesz coś nie na systemy wbudowane, to bym się nie zajmował optymalizacją zajęcia pamięci gdzieś do 30 MB, później to można się zastanawiać. Spokojnie dużo czasu na optymalizację do jakiś 300 MB nie musisz poświęcać. Dodatkowo mówisz tutaj o 1000 intach, to 4 kB, ilość zupełnie niezauważalna na współczesnych systemach. Wczytywanie dużych ilości danych z dysku też nie jest takie wolne, teraz transfer liczy się w setkach Mb. Ogólnie zwykle nie opłaca się optymalizować operacji, które są w programie wykonywane jednokrotnie.

0

Wszystko fajnie, tylko jak mam 106 takich tysiączków, to trochę pamięci już zajmuje, prawda? Wolałbym też na bieżąco nie wyliczać, bo 109 funkcji trochę by zajęło... mogę sobie napisać program, który wyliczy mi to wszystko raz, i wynik wkleić do kodu. Może kod będzie trochę zajmował, ale i tak moim zdaniem wynik otrzymam szybciej, niż gdybym wyliczał za każdym razem.

0

Pamiętaj, że kompilatory mają ograniczenie co do maksymalnego rozmiaru kodu.

0

No to trzymaj te liczby w osobnym pliku. Co Ci to da, że wpiszesz te liczby w kodzie? Przecież i tak muszą być gdzieś przechowywane - czyli lądują w pamięci. Zastanów się jeszcze nad tym, czy potrzebny Ci tak duży zakres liczb jaki daje int? Może short/unsigned short wystarczy.
Jeżeli potrzebujesz taki duży zakres to przechowywanie liczb jako napisy jest bardziej pamięciożerne - zakładając, że int ma 4 bajty to liczba złożona z więcej niż 3 cyfr mniej miejsca zajmie jako int niż jako napis.

1

Widziałeś kiedyś czterogigabajtowy plik wykonywalny? Ciekawe ile by się uruchamiał...

0

Co najlepiej zastosować, aby te liczby zajmowały jak najmniej miejsca? Wektor, tablicę, listę, lub (jeżeli można, gcc 4.3.4 przepuszcza):

unsigned short int tablica[1000] 

?
Liczby w liście to liczby naturalne mniejsze od 10000 (max. cztery cyfry).

0
cin>>ilosc;
int *tablica = new int[ilosc];
0

Mam dokładnie 1000 liczb naturalnych czterocyfrowych, które chcę zapisać w postaci wektora, listy, tablicy lub czegokolwiek innego tak, aby zajmowały jak najmniej pamięci. To co jest wyżej chyba niczego nie zmienia.

0

Ale co Ty byś chciał? Weź stwórz tablice dynamiczną na tyle liczb ile potrzebujesz w danym momencie. Wykonaj na niej operacje i zwolnij pamięć. Teraz chcesz jednak tworzyć tablice na 1000 elementów, przedtem nie chciałeś. Więc robisz albo wektor i w pętli dodajesz 1000 liczb, albo zwykłą tablicę na 1000 elementów.
Nie wiem co chcesz w ogóle osiągnąć, ale takie optymalizowanie przy czymś takim to, jak dla mnie nieporozumienie.

0
unsigned short *foo = new unsigned short[1000];

Różnica od unsigned short foo[1000] jest taka, że w pierwszym przypadku ląduje Ci na stercie, a w drugim na stosie. Stos jest ograniczony, sterta nie(no może poza ilością ramu i miejscem na plik wymiany).

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