Wpis z mikrobloga

Zobaczcie jakie dziwne zachowanie znalazłem w #cpp. Według dokumentacji std::remove powinno przenieść wszystkie elementy sełniające warunek na koniec kontenera żeby można było zastosować remove-erase idiom. Jednak jeśli po romove nie wykonamy erase i podejrzymy zawartość kontenera to zobaczymy że nie wszystkie elementy zostały przeniesione na koniec. Potraficie to wytłumaczyć?

Oznaczyłbym @cordianss ale usunął konto. Ale może Ty @sorek będziesz wiedział

Link do compiler explorer: https://godbolt.org/z/T776rEGj9



#programowanie
walokid - Zobaczcie jakie dziwne zachowanie znalazłem w #cpp. Według dokumentacji std...

źródło: cppremove

Pobierz
  • 11
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@walokid: nawet jak sobie pomyślisz jak to zoptymalizować to sam zobaczysz, że nie ma sensu ostatniego 2,5,2 przenosić, wystarczy przenieść ostatnie 3,4,5 i dać pointer że po tym się kończy nasz vector (array) i elo. Reszta rzeczy jest totalnie bez znaczenia i nie musi być faktycznie przeniesiona na koniec.
  • Odpowiedz
  • 0
@sorek: K---a geniusz

Each element of [result, last) has a valid but unspecified state, because move assignment can eliminate elements by moving from elements that were originally in that range.
  • Odpowiedz
@walokid:

Explanation


Removing is done by shifting the elements in the range in such a way that the elements that are not to be removed appear in the beginning of the range.

Shifting is done by copy assignment(until C++11)move
  • Odpowiedz
@walokid: Weź pod uwagę:

Each element of [result, last) has a valid but unspecified state, because move assignment can eliminate elements by moving from elements that were originally in that range.
  • Odpowiedz