Używam wielowątkowości i chcę scalić wyniki. Na przykład:
std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;
Chcę, aby AB musiał mieć zawartość A i zawartość B w tej kolejności. Jaki jest najbardziej efektywny sposób zrobienia czegoś takiego?
Odpowiedzi:
źródło
To właśnie funkcja członek
std::vector::insert
jest dlaźródło
insert
w iteratorach o swobodnym dostępie i była zarezerwowana z góry.distance
ma złożoność O (1)). Mimo to gwarancje wydajnościinsert
są czymś, o czym należy pamiętać, gdy często można lepiej planować z wyprzedzeniem.size < capacity
większość czasu przewidywanie rozgałęzienia najprawdopodobniej spowoduje, że instrukcje nierealokującego rozgałęzienia znajdą się w potoku instrukcji, minimalizując opóźnienie wywołane rozgałęzieniem, z wyjątkiem małej liczby iteracji. Zakłada to dobrą implementację wektorową oraz potok instrukcji procesora i [dobre] przewidywanie gałęzi, ale są to dość wiarygodne założenia dla nowoczesnego łańcucha narzędzi i komputera stacjonarnego. Nie wiem jednak o smartfonach ...Zależy od tego, czy naprawdę musisz fizycznie połączyć dwa wektory, czy chcesz sprawić wrażenie konkatenacji ze względu na iterację. Funkcja boost :: join
http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/utilities/join.html
da ci to.
powinienem ci dać
Uwaga boost :: join nie kopiuje dwóch wektorów do nowego kontenera, ale generuje parę iteratorów (zakres), które pokrywają rozpiętość obu kontenerów. Wystąpi pewien narzut wydajności, ale być może mniejszy niż skopiowanie wszystkich danych do nowego kontenera w pierwszej kolejności.
źródło
Na podstawie odpowiedzi Kirila V. Lyadvinsky'ego stworzyłem nową wersję. Ten szablon użycia fragmentu kodu i przeciążenie. Dzięki niemu możesz pisać
vector3 = vector1 + vector2
ivector4 += vector3
. Mam nadzieję, że to może pomóc.źródło
::
jest zajęte;)v1 + v2
nie stanowi dodatku.@
jak w F #Zgodnie z odpowiedzią Bradgonesurfing wiele razy nie trzeba tak naprawdę łączyć dwóch wektorów (O (n)), ale po prostu pracować z nimi tak, jakby były one połączone (O (1)) . Jeśli tak jest w twoim przypadku, można to zrobić bez potrzeby bibliotek Boost.
Sztuką jest utworzenie wektorowego proxy: klasy opakowania, która manipuluje odwołaniami do obu wektorów, zewnętrznie postrzeganych jako pojedynczy, ciągły.
STOSOWANIE
REALIZACJA
GŁÓWNE KORZYŚCI
Jest O (1) (czas stały), aby go utworzyć, przy minimalnym przydziale dodatkowej pamięci.
NIEKTÓRZY RZECZY DO ROZWAŻENIA
źródło
Jeszcze jeden prosty wariant, o którym jeszcze nie wspomniano:
I używając algorytmu scalania:
źródło
Jeśli twoje wektory są posortowane *, sprawdź set_union w <algorytm>.
Link zawiera dokładniejszy przykład
* dzięki rlbond
źródło
Wszystkie rozwiązania są poprawne, ale łatwiej mi było napisać funkcję, aby to zaimplementować. lubię to:
W ten sposób możesz uniknąć tymczasowego umieszczenia:
źródło