2012-05-29 7 views
13

Aşağıdakiler C++ standardı açısından tanımlanmış sonuçlar veriyor mu?std :: Davranışı davranışı: liste boşken başla()

std::list<int> myList; 
std::list<int>::iterator myIter = myList.begin(); // any issues? 
myList.push_back(123); 
myIter++;         // will myIter point to the 123 I pushed? 

Bunu kullanıyorum derleyicide test edebilirim ... ama daha kesin bir yanıt istiyorum.

+0

Bunun iyi bir soru olduğunu düşünüyorum çünkü bu beni gerçekten düşünmüştür, hmm, aslında. Bu bir liste ... belki bu işe yarayacak ... (Tabii ki) – jcoder

cevap

18

Tüm standart yineleyici ve konteyner türleri bu konuda aynı şekilde davranır:

§23.2.1 [container.requirements.general] p6

begin() retu kaptaki ilk elemana atıfta bulunan bir yineleyici. end(), kapsayıcının son değeri olan bir yineleyici döndürür. Kapsayıcı boşsa, begin() == end();

Ve ++it ön şartı olarak, it gibi geçmiş-uç iterators (yani sen end() ne olsun) için durum böyle değildir ki, dereferenceable olacaktır tablo 107 §24.2.3 [input.iterators] taleplerini sen tanımlanamayan davranışların korkulan alanlarına yeniden yayılıyor.

+0

bu yüzden "myIter -" ise, itilen değere işaret eder? – balki

4
std::list<int> myList; 
std::list<int> myIter = myList.begin(); 

yineleyici sen myList.end() ile başlatılıyor sanki aynı değere sahip. Yineleyici, uçtan uca konuma getirilir. Bir öğeyi listeye ittikten sonra bile yineleyici, bir-bir-sonuncu noktayı işaret eder. Onu artırırsanız, tanımlanmamış davranışları çağırıyorsunuz demektir.

GÜNCELLEME:

Örn Eğer -D_GLIBCXX_DEBUG ile GCC ile Snippet'inizi derlemek, eğer elde edilen yürütülebilir duracaktır:

/usr/include/c++/4.6/debug/safe_iterator.h:236:error: attempt to increment 
    a past-the-end iterator. 

Objects involved in the operation: 
iterator "this" @ 0x0x7fffc9548fb0 { 
type = N11__gnu_debug14_Safe_iteratorINSt9__cxx199814_List_iteratorIiEENSt7__debug4listIiSaIiEEEEE (mutable iterator); 
    state = past-the-end; 
    references sequence with type `NSt7__debug4listIiSaIiEEE' @ 0x0x7fffc9548fb0 
} 
zsh: abort (core dumped) ./listiter 
+0

... bir dairesel listeye sahip olmanızın bir sonucu olarak, bir-bir-sonda size bazılarına göre meşru bir başlangıç ​​noktası verebilir. tanımlar. Yani kesinlikle emin misin ... ... ya da eğitimli bir tahmin mi yapıyorsun? – omatai

+5

@omatai: 'std :: list <>' dairesel değil. – wilx

+0

Ah - evet - yorgun aklımda, "çift taraflı" ile "döngüsel" bir şey karıştırdım, çünkü (her ne kadar yıllar önce) ikiye katlanmış bir liste oluşturduğumda, her zaman tek bir başın/kuyruğun tamamlandığını " daire". D'Ah! Eve gitmem gerek ... – omatai