Pertanyaan Hapus elemen menggunakan iterator, tanpa mengenal vektor


Saya punya situasi. Saya telah menggunakan fungsi templated untuk salah satu tugas saya. Untuk fungsi ini, saya meneruskan iterator dengan referensi. Sekarang, saya harus menghapus beberapa elemen dari sebuah vektor. Bagaimana saya melakukan ini hanya menggunakan iterator? Pl temukan kode masing-masing:

template <class BidirectionalIterator, class Iterator> bool

SomeFunc( BidirectionalIterator& first, BidirectionalIterator& last, Iterator anotherVecBegin )
{
    while((first+1) != last)
    {
        if(some_condition)
            // delete (first); HOW?
        else if(some_other_condition)
            // delete (first + 1); HOW?
    }

    // add something to another vector using anotherVecBegin

    return true;
}

Ada banyak pertanyaan yang sudah diajukan, tetapi semuanya memiliki vektor dalam konteks. begitu myVec.erase(*first) gampang..

Saya juga sadar bahwa itu bukan cara yang sangat bagus yang saya lewati iterator dengan referensi. Tetapi saya mengikuti aturan sederhana: gunakan referensi ketika sesuatu diharapkan untuk diubah atau untuk menghindari salinan berat. Skenario saya adalah kondisi pertama yang pas.

Jadi Bagaimana saya menghapus?


5
2018-01-11 09:37


asal


Jawaban:


Anda tidak dapat mengubah penampung jika semua yang Anda miliki adalah iterator untuk elemen penampung. Inti dari iterator adalah memisahkan konsep wadah dari konsep berbagai elemen, sehingga algoritma dapat diekspresikan secara universal dalam hal yang terakhir tanpa peduli tentang yang pertama. Itu juga mengapa kami memiliki remove algoritma yang memungkinkan rentang dan kembali sebuah iterator yang cocok untuk menghapus elemen dari sebuah wadah, tetapi menghapusnya perlu dilakukan oleh seseorang yang tahu wadahnya.


6
2018-01-11 09:43



Anda tidak bisa. Menghapus elemen dari penampung akan membuat semua iterator tidak valid, jadi Anda harus memperbarui first dan last setelah setiap penghapusan.


2
2018-01-11 09:42



  1. Pustaka standar: Anda harus mendapatkan referensi ke penampung, atau tangguhkan penghapusan ke tempat yang Anda miliki. Tidak ada jalan lain. Wadah diperlukan untuk menambah atau menghapus elemen dan tidak ada cara untuk menemukan wadah dari iterator.

    Selain itu, jangan lupa, bahwa menghapus dari vektor membatalkan semua iterator ke vektor itu.

  2. Perpustakaan lainnya: Boost.Intrusive memiliki beberapa wadah yang memungkinkan Anda melakukan apa saja hanya dengan penunjuk ke objek (yang berfungsi ganda sebagai iterator), tetapi mereka adalah daftar tertaut, yang umumnya kurang efisien daripada vektor untuk sebagian besar tujuan.


2
2018-01-11 09:46