Soru Std :: vector kopyalanıyor: atama veya std :: copy tercih edilir mi?


İki vektörüm var:

std::vector<int> v1, v2;

// Filling v1
...

Ve şimdi kopyalamam gerekiyor v1 için v2. Tercih etmek için herhangi bir sebep var mı

v2 = v1;

için

std::copy (v1.begin(), v1.end(), v2.begin());

(ya da tam tersi)?


42
2018-02-20 10:32


Menşei


Atama operatörü doğru olanı yapar. Yazdığınız gibi copy, eğer berbat olur v1 daha büyüktür v2. - jrok
Eğer v1 kopyadan sonra gerekli değil sadece v2.swap(v1);. - hmjd
Ne yapmak istediğini yaz. Bir vektörü diğerine atamak istiyorsanız, bunu yazın. - Alex Chamberlain


Cevaplar:


Genelde şiddetle tercih ederim v2 = v1:

  1. Daha kısa ve niyetini daha net kılıyor
  2. std::copy eğer işe yaramazsa v2 ile aynı uzunlukta değil v1 (yeniden boyutlandırılmaz, bu yüzden eski öğelerin bazılarını en iyi durumda tutacaktır (v2.size() > v1.size() ve programın en kötü durumunda başka bir yerde kullanılan bazı rastgele verilerin üzerine yaz
  3. Eğer v1 sona ermek üzeredir (ve C ++ 11 kullanırsınız). move içerikler
  4. Performansa bağlı atama daha yavaş olma ihtimali düşüktür. std::copyçünkü uygulayıcıların muhtemelen kullanacağı std::copy dahili olarak, bir performans avantajı sağladıysa.

Sonuç olarak, std::copy daha az anlamlı, yanlış bir şey yapabilir ve daha hızlı değildir. Yani burada kullanmak için herhangi bir sebep yok.


52
2018-02-20 10:37



O zaman ne std::copy için? - altroware
@altroware: Bir aralıktan diğerine genel kopyalama içindir. Örneğin, kopyalamak için atama operatörünü kullanamazsınız. std::listbir std::vectorveya bir bölümden std::vector aynı başka bir kısmına std::vector. - Benjamin Lindley
V1 istifte tahsis edilirse ve tahrip olursa ne olur? does v2 = v1 v1'in öğeleri kopyalanmasına neden oluyor? - James Wierzba
Eleman tipinin hangi kopyalama mekanizması denir? Bu durumda vector<int>, bir vektörden diğerine kopyalanan tamsayılardır operator=veya ile intkopya kurucusu? - Gauthier
Operatörü nasıl uygularsınız =, bu durumda? - jorge saraiva


Çağırma std::copy Hedef vektörün sonunun ötesindeki öğelere erişmeyi deneyebilir.

Ödevi kullan.

Mikro optimizasyon yapmak senin işin değil: kütüphane yazarının sorumluluğu ve nihayetinde derleyicinin sorumluluğu.

Kodunuzu yapabilirsiniz keyfi hızlı Doğru olması gerekmiyorsa.

Durumunda copyBununla birlikte, daha hızlı ve hatta genel durum için kesinlikle doğru olup olmadığı oldukça şüpheli.


9
2018-02-20 10:35



Optimizasyon ile ilgili ifadelerinize katılıyorum, ancak derleyici veya kütüphane için daha fazla bilginin işini ne kadar iyi yapabileceğine işaret etmek faydalı olabilir. Üye fonksiyonları std::vector üzerinde çalıştığını biliyorum std::vectorve nasıl uygulandığını bilin. std::copy bu bilgiye sahip değil. Sonuç, üye fonksiyonların muhtemelen işi daha iyi yapabilmesidir (ve kesinlikle daha da kötü değil). - James Kanze


Eğer v2 Kullanmazsanız yeterince büyük bir arabellek taşacaksınız copy sahip olduğunuz gibi.

Push_back'i arayacak bir arka ekleme yineleyicisi kullanabilirsiniz. v2. Ancak bu, ne kadar büyük olduğuna bağlı olarak birden fazla yeniden tahsise yol açabilir. v1 olduğunu.

copy(v1.begin(), v1.end(), back_inserter(v2));

İzin vermen daha iyi vector işleri doğru bir şekilde yönetin. Atama operatörü, bunu yapar vector::assign:

v2.assign(v1.begin(), v1.end());

Görevlendirilen işletmeci açısından bir idamım var. vector::assign.


6
2018-02-20 10:40



Bay Wood, v2.assign (v1.begin (), v2.end ()) yerine v2.assign (v1.begin (), v1.end ()) ifade etmeniz mümkün mü? - Peter Schaeffer
@PeterSchaeffer sabit, teşekkürler - Peter Wood


Daha kısa.

std::copy esas olarak kapların bölümlerini kopyalamak içindir. Tüm bir kapsayıcıyı kopyalamanız gerekiyorsa, kopya kurucuyu da kullanabilirsiniz.


2
2018-02-20 10:35



Eğer v2 yeterince büyük değil bir arabellek taşması alırsınız. - Peter Wood


Atama, çok uzak. Daha genel olarak, vektörün boyutu her zaman değişebilir veya vektörün tüm içeriğini değiştirebilir, üye fonksiyonlarını tercih etmelisiniz. Tek zaman std::copy Eğer vektör içinde sadece küçük bir aralığı tamamen değiştiriyorsanız uygun olur.


2
2018-02-20 10:36





Atama net ve dahili olarak kullanılır std::copy (veya unitizalized_copy  _M_allocate_and_copy büyüklük ve kapasiteye bağlı olarak) veya benzer performanslar aynıdır.


1
2018-02-20 10:46