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

vector jako argument funkcji

Cloud VPS
+1 głos
1,093 wizyt
pytanie zadane 24 stycznia 2021 w C i C++ przez hicodyn Początkujący (420 p.)

Mam funkcję, która jako parametr ma przyjąć vector<punkt> (punkt to struktura stworzona przeze mnie). W trakcie działania funkcja przepisuje jeden element z tego vectora do innego, który zwraca. Jak zrobić, żeby funkcja mogła zmodyfikować zawartość vectora, który jest przekazany jako parametr funkcji? Tutaj jest kod:

std::vector<punkt> zapisCentroidow(daneWejsciowe przelaczniki,std::vector<punkt> vectorPunktow)
{
    std::vector<punkt> vectorCentroidow;
    for (int i = 0; i < przelaczniki.k; i++)
    {
        vectorCentroidow.push_back(vectorPunktow[i]);
        vectorPunktow.erase(vectorPunktow.begin(),vectorPunktow.begin()+1);
    }

    return vectorCentroidow;
}

 

1 odpowiedź

+2 głosów
odpowiedź 24 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)
wybrane 25 stycznia 2021 przez hicodyn
 
Najlepsza
Przekaż vector poprzez referencje.
Kilka rzeczy:
1. Czy masz zawsze 100% pewności, że przelaczniki.k będzie mniejsze/równe ilości elementów w vectorze? Jeśli nie, to polecam wykonać jakieś sprawdzenia
2. Do zwykłej iteracji używaj size_t, zamiast int, a w tym przypadku nawet ranged for
3. Wygląda mi na to, że tutaj w zasadzie wystarczy Ci move
komentarz 25 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)
To co Ty robisz to po prostu std::move (ten drugi, z <algorithm>), który w zasadzie zostawia nas z bardzo podobnym stanem, co zwyczajny std::move (ten z <utility>). Kod, który mierzyłem, to ten sam kod, który udostępnił OP. Testowałem tylko różne jego wersje - z przekazywaniem przez referencję, z resize do rozmiaru vectora z parametru, oba na raz.
komentarz 25 stycznia 2021 przez tkz Nałogowiec (42,040 p.)
Wiem co robię. Kwestia kosztu. Standardowy erase jest O(n), gdzie podany przeze mnie jest w O(1). Mierzenie kodu autora sprowadza się do usuwania, które jest najbardziej czasochłonne. Kopiowanie to minimalny koszt w porównaniu z pętlą.
komentarz 25 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)
No tak, bo usuwamy z przodu, a nie z tyłu, ale tak czy siak nie widzę sensu pisać osobnej funkcji tego typu, skoro std::move zrobi to za nas i to jeszcze szybciej.
komentarz 25 stycznia 2021 przez tkz Nałogowiec (42,040 p.)
Ale co zrobi? Usunie? Przeniesie własność? Nie wiem do końca do czego się odnosisz. Kod by dużo rozjaśnił.  Bez testów wydajnościowych, trudno mi powiedzieć co będzie lepsze, czytaj szybsze.
komentarz 25 stycznia 2021 przez NewEraOfPeace Gaduła (4,790 p.)
Przenosi własność, mam na myśli move jako cast do r-val reference.

Podobne pytania

0 głosów
1 odpowiedź 1,117 wizyt
pytanie zadane 8 kwietnia 2018 w C i C++ przez giedymin33 Początkujący (290 p.)
+1 głos
0 odpowiedzi 703 wizyt
pytanie zadane 2 czerwca 2021 w C i C++ przez Mavimix Dyskutant (8,420 p.)
0 głosów
1 odpowiedź 485 wizyt
pytanie zadane 15 maja 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)

93,483 zapytań

142,417 odpowiedzi

322,763 komentarzy

62,895 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

Kursy INF.02 i INF.03
...