cara menambahkan objek daftar‹T› ke objek lain

di C++, saya memiliki dua objek list<T> A dan B dan saya ingin menambahkan semua anggota B ke akhir A. Saya telah mencari beberapa sumber berbeda dan belum menemukan solusi sederhana (mis. A.append(B);) dan ini sedikit mengejutkan saya.

Apa cara terbaik untuk melakukan ini?

Kebetulan, saya tidak peduli dengan B setelah ini (itu akan dihapus di baris berikutnya) jadi jika ada cara untuk memanfaatkannya untuk kinerja yang lebih baik, saya juga tertarik dengan hal itu.


person BCS    schedule 19.09.2009    source sumber


Jawaban (2)


Jika Anda ingin menambahkan salinan item di B, Anda dapat melakukan:

a.insert(a.end(), b.begin(), b.end());

Jika Anda ingin memindahkan item dari B ke akhir A (mengosongkan B pada saat yang sama), Anda dapat melakukan:

a.splice(a.end(), b);

Dalam situasi Anda, penyambungan akan lebih baik, karena ini hanya melibatkan penyesuaian beberapa petunjuk dalam daftar tertaut.

person UncleBens    schedule 19.09.2009
comment
+1. Benar sekali. Seandainya bisa semudah dan seefisien itu untuk membagi peta dan kumpulan... - person paercebal; 20.09.2009
comment
Apakah salah satu dari operasi ini O(1)? - person Chris Redford; 13.03.2013
comment
Saya kira sambungan harus O(1) untuk kasus di atas. - person chunkyguy; 27.03.2013
comment
Ini adalah O(1) untuk a.splice(a.end(), b) dan a.splice(a.end(), b, it_b_start), tetapi O(n) untuk a.splice(a.end(), b, it_b_start, it_b_end). - person hkBattousai; 08.08.2013
comment
Apakah metode ini bersifat atomik? dapatkah saya menggunakannya di lingkungan paralel? - person orezvani; 27.03.2014
comment
@hkBattousai, bagian menarik tentang penjadwal proses, namun saya dapat menggunakan lebih banyak info tentang bagian spesifik itu, mungkin Anda dapat memberikan tautan dengan lebih detail tentang alasannya O(1) dan O(n) ? - person serup; 12.12.2016
comment
Mengapa, o mengapa, STL tidak dapat mendukung a.append(b) saja? - person srking; 08.12.2017

salah satu contoh menggunakan boost

std::list<T> A; // object A is a list containing T structure
std::list<T> B; // object B is a list containing T structure

// append list B to list A
BOOST_FOREACH(auto &listElement, B) { A.push_back( listElement ); }
person serup    schedule 12.12.2016