2013-06-05 16 views
11

Właśnie uczę się i mam prawdopodobnie głupie pytanie.std :: list resize daje nieoczekiwane wyniki

Mam 2 pojemniki, jeden to wektor, a drugi to lista. Oba są wypełnione intami 1,2,3,4. Po ich inicjalizacji zmieniam rozmiar pojemnika na rozmiar siedmiu, a następnie wydrukuję zawartość pojemnika.

#include <iostream>  
#include <vector>  
#include <list> 

int main() 
{ 
std::list<int> lst= {1,2,3,4}; 
std::vector<int> vec = {1,2,3,4}; 

lst.resize(7); 
vec.resize(7); 

for (auto p = lst.begin(); p!=lst.end(); ++p) 
    std::cout<<"List: "<<*p<<std::endl; 

for (auto p = vec.begin(); p!=vec.end(); ++p) 
    std::cout<<"Vector: "<<*p<<std::endl; 

return 0; 
} 

W wyjściu otrzymuję:

List: 1 
List: 2 
List: 3 
List: 4 
List: 0 
List: 1994995248 
List: 0 
Vector: 1 
Vector: 2 
Vector: 3 
Vector: 4 
Vector: 0 
Vector: 0 
Vector: 0 

muszę wyraźnie powiedzieć, że listy dodaję 0s aby tego uniknąć?

+2

Jakiego kompilatora używasz? Wydaje się, że nie mogę tego odtworzyć tutaj: http: //ideone.com/9BwQJ6. Mają być zainicjowane wartością, jeśli nie określisz wartości podczas zmiany rozmiaru. – taocp

+0

http://www.cplusplus.com/reference/list/list/resize/ – Nic007

+0

Wygląda na to, że powinien on użyć wartości domyślnej, aby wypełnić miejsca, ale możesz spróbować wywołać 'lst.resize (7, 0) ; ', po prostu zobaczyć, co się stanie. – cxyzs7

Odpowiedz

1

Podobnie jak inni użytkownicy, lst.resize(7,0) rozwiąże problem. Użycie wartości lst.resize(7) i pominięcie wartości inicjalizacyjnej mówi kompilatorowi, że nie ma znaczenia, jaka jest wartość (prawdopodobnie dlatego, że ustawisz ją później). Pozwala to systemowi operacyjnemu pozostawiać dowolną wartość losową w pamięci, zamiast wydawać środki na jej zmienianie.

Kontener Vector zawiera kod, który automatycznie inicjuje pozycje do zera.

+2

Myślałem, że standard wymagany dla pozostałych elementów listy jest Inicjalizowany do '0' też – blue

+0

To jednak nie jest zgodne ze standardem C++, który wymaga, aby nowe elementy były inicjowane wartościami (a więc inicjalizowane zerowo dla' int's). –

+0

W typowej implementacji 'resize' ma dwa parametry, z których drugi ma zainicjowany wartością domyślny argument. Z tego powodu 'lst.resize (7)' jest równoznaczne z 'lst.resize (7, 0)' i ma gwarancję zainicjowania nowych elementów zerami. Inne implementacje mogą robić to inaczej (przeciążanie itp.), Ale wynik końcowy musi być taki sam. – AnT

Powiązane problemy