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

C++ Tablice Dynamiczne

Object Storage Arubacloud
0 głosów
2,428 wizyt
pytanie zadane 21 września 2017 w C i C++ przez Ziom Początkujący (430 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 (37,640 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 Mędrzec (194,920 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 Mędrzec (172,590 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 Ekspert (212,670 p.)
Przy każdym push backu tablica jest kopiowana?
komentarz 21 września 2017 przez criss Mędrzec (172,590 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 Mędrzec (172,590 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 niezalogowany
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 Mędrzec (172,590 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 niezalogowany

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ź 473 wizyt
pytanie zadane 8 kwietnia 2017 w C i C++ przez ChiriChiri Obywatel (1,260 p.)
0 głosów
1 odpowiedź 306 wizyt
0 głosów
2 odpowiedzi 810 wizyt
pytanie zadane 19 stycznia 2020 w C i C++ przez xZenit Użytkownik (760 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...