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

[C++] Czy vector posiada taką funkcjonalność?

Object Storage Arubacloud
–1 głos
328 wizyt
pytanie zadane 21 marca 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)

Witam! Na potrzeby programu potrzebuję vectora, który będzie mi przechowywał pewne obiekty. Z obiektami tymi (z poziomu użytkownika) będzie można robić różne rzeczy. Miedzi innymi usuwać. I chodzi mi o to, że gdy użytkownik dodaje nowe obiekty o konkretnych nazwach, to vector ma wyglądać tak:

(np.)

> add object t "Siemson"

> add object bla 15

>add object elo 1.0

 

i vector ma wyglądać tak:

t 
bla
elo

jednakże. Teraz użytkownik będzie chciał usunąć element bla.

>del object bla

i vector ma wyglądać tak:

t
elo

A domyślam się, że będzie wyglądać tak: 

t

elo

 

Do kodu mi jeszcze daleko, ale podejrzewam, że podczas usuwania elementów z vectora, pozostałe dalej pozostają na swoich miejscach. (Na algorytmach się za bardzo nie znam) Jakoś bym pewnie dał radę napisać funkcję przesuwającą te kolejne elementy w dół, ale jak tych elementów będzie setki (a to praca z vectorami) to już to ze strony użytkownika nie będzie tak bajecznie wyglądało..

2 odpowiedzi

0 głosów
odpowiedź 21 marca 2018 przez Bondrusiek Maniak (61,370 p.)

Witam

zobacz ten program.

#include <iostream>
#include <vector>
#include <string>
int main ()
{
  std::vector<std::string> myvector;

   myvector.push_back("Siemson");
    myvector.push_back("bla");
    myvector.push_back("elo");

  myvector.erase (myvector.begin()+1);


  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); ++i)
    std::cout << ' ' << myvector[i] << endl;
  std::cout << '\n';

  return 0;
}

Można bez problemu usunąć rekord z vectora. Dzięki funkcji składowej vector::erase(iterator position)

http://www.cplusplus.com/reference/vector/vector/erase/

0 głosów
odpowiedź 21 marca 2018 przez mokrowski Mędrzec (155,460 p.)

Oczywiście że std::vector ma taką funkcjonalność i dobrze Ci kolega napisał że jest to erase() na tymże wektorze. std::vector po wykonaniu takiego pojedynczego wywołania erase(), sam dokonuje realokacji (nazwałeś to przesunięciem) pamięci. Jeśli były tam obiekty (a nie wskaźniki), będą uruchamiane ich destruktory oraz konstruktory kopiujące lub przenoszące (bo trzeba zmienić ich miejsce położenia). Problem pojawia się jeśli obiektów powinieneś usunąć kilka.

Po każdym erase(), pamięć za miejscem gdzie usuwasz obiekt który był w std::vector, ulega zmianie (przecież będzie realokowana). Stąd jeśli chcesz usunąć 5 obiektów, będzie trzeba zaczynać wykonanie erase() od nowa..... i ... będzie to 5 "wodospadów realokacji". Aby ograniczyć taką operację do 1 tylko wywołania realokacji pamięci, stosujesz idiom językowy Erase-remove idiom. Przypatrz się dokładnie co się tu dzieje w kodzie:

https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom

 

komentarz 21 marca 2018 przez Hiskiel Pasjonat (22,830 p.)
Dobrze, zaraz zajrzę, ale najpierw pytanie. Co to jest do kija ten konstruktor przenoszący? Nigdzie nic nie potrafię o tym znaleźć, a w książce z której się uczyłem podstaw nic o tym nie ma. Czy to nie jest tak, że obiekt pozostaje w pamięci cały czas tak sam? Po co co jest ten konstruktor?
komentarz 21 marca 2018 przez mokrowski Mędrzec (155,460 p.)
#include <iostream>
#include <vector>
#include <string>

struct Q {
    Q() {
        std::cout << "Q constructor\n";
    }
    Q(const Q& src) {
        std::cout << "Q copy constructor\n";
    }
    Q& operator=(const Q& src) {
        std::cout << "Q operator=\n";
        return *this;
    }
    Q(Q&& src) {
        std::cout << "Q move constructor\n";
    }
    Q& operator=(Q&& src) {
        std::cout << "Q move operator=\n";
        return *this;
    }
    ~Q() {
        std::cout << "Q destructor\n";
    }
};

int main() {
    std::vector<Q> vec(10); // Nastąpi automatyczne kreowanie 10 obiektów Q
    std::cout << std::string(50, '-') << '\n';
    vec.erase(vec.cbegin() + 3); // Wyrzucamy z indeksu 3 element
    std::cout << std::string(50, '-') << '\n';
}

Komentuj funkcję z podwójnymi & i popatrz jakie są wyniki, czy się kompiluje.. itp.. 

PS. Jak nie ma informacji w książce... może czas zmienić książkę na nowszą?

komentarz 21 marca 2018 przez Hiskiel Pasjonat (22,830 p.)
A co to za operator &&?
komentarz 21 marca 2018 przez mokrowski Mędrzec (155,460 p.)
rvalue reference - referencja do prawej wartości Właśnie takie referencje wykorzystują operacje przenoszące od C++11.
komentarz 21 marca 2018 przez Hiskiel Pasjonat (22,830 p.)
Em... Skoro jest biały -  jest czarny. Jest prawda jest fałsz... To czy jest rvf (rvalue reference) i lvr?

Podobne pytania

0 głosów
0 odpowiedzi 184 wizyt
0 głosów
1 odpowiedź 254 wizyt
pytanie zadane 19 marca 2022 w C i C++ przez pasjonat_algorytmiki Pasjonat (19,540 p.)
0 głosów
2 odpowiedzi 494 wizyt

92,555 zapytań

141,402 odpowiedzi

319,539 komentarzy

61,938 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!

...