• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Tablice Dynamiczne

0 głosów
369 wizyt
pytanie zadane 21 września 2017 w C i C++ przez Ziom Początkujący (280 p.)
Witam wszystkich. Z uwagi na to że jestem początkującym programistą mam do was pytanie. Otóż jak można dynamicznie zwiększać rozmiar tablicy? Tzn deklaruję sobie tablicę o rozmiarze 5 i chciałbym zwiększać jej rozmiar o 1 przez funkcję by dodawać nowe elementy i jak można później sprawdzić rozmiar tej tablicy by upewnić się że wszystko działa poprawnie? Z góry dziękuję za odpowiedzi i pozdrawiam :)

3 odpowiedzi

+1 głos
odpowiedź 21 września 2017 przez Knayder Nałogowiec (32,730 p.)

Nie baw się w wymyślanie koła na nowo. Użyj po prostu klasy std::vector.
Tutaj masz dokumentację jak jej używać, ale z łatwością znajdziesz materiały po Polsku.

0 głosów
odpowiedź 21 września 2017 przez j23 Nałogowiec (46,480 p.)
edycja 21 września 2017 przez j23
  • tworzysz nową tablicę o jeden element większą.
    size_t n = 5;
    T *tab = new T[n];
    ...
    
    T *new_tab = new T[n + 1];
    
    

     

  • kopiujesz zawartość starej tablicy do nowej.
    copy(tab, tab + n, new_tab);

     

  • starą usuwasz.
    delete[] tab;
    tab = new_tab;
    ++n;

     

Ale jeśli nie musisz, użyj wspomnianego vectora.

0 głosów
odpowiedź 21 września 2017 przez Criss VIP (129,490 p.)
Zaalokować większy blok pamięci, przekopiowiać stary blok do nowego i zwolnić stary. Sprawdzić rozmiaru nie masz jak. Musisz go sobie gdzieś na bieżąco zapisywać. Z resztą - dokładnie to realizuje std::vector, więc nie ma potrzeby pisać tego samemu.
komentarz 21 września 2017 przez Ehlert VIP (119,580 p.)
Przy każdym push backu tablica jest kopiowana?
komentarz 21 września 2017 przez Criss VIP (129,490 p.)
Jasne, że nie :D To by było zabójcze. Z reguły przy każdej alokacji tablicy rozmiar jest zdwukrotniany (czyli praktycznie zawsze jest jakiś overhead), ale nie wiem czy to jest standaryzowane.
komentarz 22 września 2017 przez Criss VIP (129,490 p.)

Ze standardu C++14 nt. metod emplace_back i push_back [23.3.6.5]:

Causes reallocation if the new size is greater than the old capacity. If no reallocation happens, all the iterators and references before the insertion point remain valid. If an exception is thrown other than by the copy constructor, move constructor, assignment operator, or move assignment operator of T or by any InputIterator operation there are no effects. If an exception is thrown while inserting a single element at the end and T is CopyInsertable or is_nothrow_move_constructible::value is true, there are no effects. Otherwise, if an exception is thrown by the move constructor of a non-CopyInsertable T, the effects are unspecified.  

Więc najwyraźniej standard w ogóle nie definiuje jak dużo vector powinien zaalokować przy "powiększaniu" wewnętrznej tablicy. Pierwsze, pogrubione zdanie jest w zasadzie jedynym mówiącym cokolwiek o alokacji.

komentarz 22 września 2017 przez Hipcio Nałogowiec (46,180 p.)
Na GCC jest razy o 100%, ale na MSVC rozmiar zwiększany jest średnio o 2/3 poprzedniej wartości.
komentarz 22 września 2017 przez Criss VIP (129,490 p.)
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v(50);
    v.emplace_back();
    std::cout << v.capacity();
}

Output:
gcc 8: 100
clang 6: 100
msvc 19*: 75

* 19 to ten z VS2015

komentarz 22 września 2017 przez Hipcio Nałogowiec (46,180 p.)

Ja sprawdzałem taki przykład:

#include <iostream>
#include <vector>

int main()
{
	std::vector<int> ints;

	for (int i = 0; i < 10000; i++)
	{
		ints.push_back(3);

		if (ints.size() == ints.capacity())
		{
			std::cout << ints.capacity() << "\n";
		}
	}
}

Podobne pytania

0 głosów
1 odpowiedź 64 wizyt
pytanie zadane 8 kwietnia 2017 w C i C++ przez ChiriChiri Obywatel (1,170 p.)
0 głosów
2 odpowiedzi 392 wizyt
pytanie zadane 26 stycznia 2017 w Java przez Jonbi2 Dyskutant (8,280 p.)
0 głosów
2 odpowiedzi 113 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez czujek22 Mądrala (5,870 p.)
Porady nie od parady
Publikując kody źródłowe korzystaj ze specjalnego bloczku koloryzującego składnię (przycisk z napisem code w edytorze). Nie zapomnij o ustawieniu odpowiedniego języka z rozwijanego menu oraz czytelnym formatowaniu kodu.
Ciekawy innych porad? Odwiedź tę stronę!

45,542 zapytań

85,864 odpowiedzi

171,315 komentarzy

22,050 pasjonatów

Przeglądających: 285
Pasjonatów: 30 Gości: 255

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...