2012-12-28 39 views
6

Olası Çoğalt:
Does moving a vector invalidate iterators?Std :: vector :: data() taşınarak mı korunur?

aşağıdaki kodları düşünün:

std::vector<T> prepare(T*& data) { 
    std::vector<T> buffer; 
    // Fill in buffer. 
    data = buffer.data(); 
    return buffer; 
} 

... 

T* data; 
auto vec = prepare(data); 
// line 12 

o vec.data() != data hat 12'de mümkün mü? Benzer şekilde,

std::vector<T> buffer; 
// ... Fill in buffer ... 
T* data = buffer.data(); 
auto vec = std::move(buffer); 
// line 5 

mümkün mü bu hat 5'de vec.data() != data?

Pratik olarak her ikisi de libstdC++ ve libC++ uygulamasında mümkün değildir, çünkü hareket yapıcılar basit işaretçi atamaları olarak uygulanmıştır, ancak standart bir şey belirtmemektedir (Is the capacity required to be preserved when moving a std::vector?'a benzer). "Sabit karmaşıklık" vec.data() == data'u garanti edebilir mi?

+0

Yineleyicileri/göstergeleri geçersiz kılan şeyler oldukça iyi sayılır. –

+0

Ayrıca, ilgili: http://stackoverflow.com/questions/4124989/does-stdvectorswap-invalidate-iterators –

cevap

0

Sabit karmaşıklık, kapsayıcı öğelerin tek tek öğeleri kopyalamasına/taşımasına izin verilmediği anlamına gelir; bu nedenle, varolan depolama alanının sahipliğini yeni nesneye aktarması gerekir, böylece data() tarafından döndürülen işaretçi aynı olmalıdır.

Yalnızca ataşman türü için propagate_on_container_move_assignment doğruysa ve ayırıcılar eşitse, hareket ataması (yapı yerine taşıma yerine) için doğrudur.

+0

Bazı çılgın uygulamalar, tek tek elemanların sabit sayısını taşıyabilir/kopyalayabilir. – zch

+0

@zch: Bu, bitişik şart tarafından yasaklanmıştır. –

+0

@BenVoigt, ne hakkında 'if (<10) copyAll(); else moveOwnership(); '? – zch

İlgili konular