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

C++ Tablice Dynamiczne

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

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...