Ödevi std :: vector :: erase () ve std :: deque :: erase () içinde kopyala / taşı


135

Cevaplama sürecinde başka bir soru ben biraz farklı ifadelere tökezledi std::vector::erase()ve std::deque::erase().

C ++ 14'ün söylediği şey std::deque::erase( [deque.modifiers]/4-6, benimki vurgu):

Etkileri: ...

Karmaşıklık: Yıkıcıya yapılan çağrıların sayısı, silinen elemanların sayısıyla aynıdır, ancak atama operatörüne yapılan çağrıların sayısı, silinmiş elemanlardan önceki eleman sayısından ve elemanlardan sonraki eleman sayısından az değildir. silinen öğeler.

Atar: Kopya oluşturucu, taşıma yapıcısı, atama işleci veya taşıma atama işleci tarafından istisna oluşturulmadıkça hiçbir şey yapılmaz T.

Ve işte std::vector::erase( [vector.modifiers]/3-5) hakkında söyledikleri :

Etkileri: ...

Karmaşıklık: yıkıcı Tsayısı olarak adlandırılır silinir eleman sayısına eşit, ancak hareket atama operatörü arasında Tsayısı olarak adlandırılır silinir elemanları sonra vektöründe eleman sayısını eşittir.

Atar: Kopya oluşturucu, taşıma yapıcısı, atama işleci veya taşıma atama işleci tarafından istisna oluşturulmadıkça hiçbir şey yapılmaz T.

Gördüğünüz gibi, her ikisi için istisna özellikleri aynıdır, ancak std::vectortaşıma atama operatörünün çağrıldığı açıkça belirtilmiştir.

Orada şartı da var Tolmaya MoveAssignableyönelik erase()her ikisi ile çalışmak için std::vectorve std::deque(Tablo 100), ancak bu hamle atama operatörünün varlığını anlamına gelmez: Bir kopyası atama operatörü tanımlamak ve hareket atama operatörü tanımlamaz ve bu sınıf söylenmeyeceğim olmak MoveAssignable.

Her ihtimale karşı, GCC ve Clang ile kontrol ettim ve gerçekten de std::vector::erase()hareket atama operatörü yoksa kopya atama operatörünü çağırıyor std::deque::erase()ve aynı şeyi yapıyor ( DEMO ).

Yani soru şudur: Bir şey mi kaçırdım, yoksa bu standarttaki (editöryal) bir sorun mu?

Güncelleme: 2477 numaralı LWG sorununu gönderdim .


14
Standartta bir kusur gibi görünüyor.
Barry

4
^ ack. Bir LWG sorunu uygun olacaktır.
Columbo

4
Genellikle taslak standart yeterince iyidir. Bu, gerçek şeye bakmanız gereken durumlardan biridir.
Mark Ransom

3
@MarkRansom std :: deque ve std :: vector için standardın geçerli kaynağı sorudakiyle aynıdır, bu nedenle son sürümün farklı olma olasılığı çok azdır.
Anton Savin

3
N4141, N4140 ile aynı ifadeye sahiptir.
Brian

Yanıtlar:


9

Lenexa toplantısında sorun önerilen çözümle Derhal statü kazandı :

Bu ifade N4296'ya göredir.

23.3.3.4 [deque.modifiers] / 5'i şu şekilde değiştirin:

-5- Karmaşıklık : yıkıcı yapılan aramaların sayısı arasındaT silinen elemanların sayısı ile aynıdır, ancak atama operatöre aramaların sayısı arasındaT silinir elemanları ve daha önce daha fazla eleman sayısında az daha silinen elemanlardan sonraki eleman sayısı.

23.3.6.5 [vector.modifiers] / 4'ü şu şekilde değiştirin:

4- Karmaşıklık : yıkıcı Tsayısı olarak adlandırılır silinir eleman sayısına eşit, ancak hareket atama operatörü Tsayısı olarak adlandırılır silinir elemanları sonra vektöründe eleman sayısını eşittir.

Yani, karar kabul edilirse, taşınma atamasından özel olarak bahsedilmeyecek std::vector::eraseve ayrıca ifadesi std::deque::erasebiraz açıklanacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.