벡터
벡터는 크기 조절이 가능한 배열입니다. 슬라이스와 마찬가지로 크기를 컴파일 타임에 알 수 없지만, 언제든지 늘리거나 줄일 수 있습니다. 벡터는 3개의 파라미터로 표현됩니다:
- 데이터에 대한 포인터
- 길이
- 용량
용량은 벡터를 위해 예약된 메모리 양을 나타냅니다. 벡터는 길이가 용량보다 작은 동안에는 계속 늘어날 수 있습니다. 이 임계값을 넘어야 할 때, 벡터는 더 큰 용량으로 재할당됩니다.
fn main() {
// 이터레이터는 벡터로 수집(collect)될 수 있습니다
let collected_iterator: Vec<i32> = (0..10).collect();
println!("(0..10)을 다음으로 수집함: {:?}", collected_iterator);
// `vec!` 매크로는 벡터를 초기화하는 데 사용될 수 있습니다
let mut xs = vec![1i32, 2, 3];
println!("초기 벡터: {:?}", xs);
// 벡터 끝에 새로운 요소를 삽입합니다
println!("벡터에 4를 푸시합니다");
xs.push(4);
println!("벡터: {:?}", xs);
// 에러! 불변 벡터는 늘어날 수 없습니다
collected_iterator.push(0);
// FIXME ^ 이 줄을 주석 처리하세요
// `len` 메서드는 현재 벡터에 저장된 요소의 개수를 반환합니다
println!("벡터 길이: {}", xs.len());
// 인덱싱은 대괄호를 사용하여 수행됩니다 (인덱싱은 0부터 시작합니다)
println!("두 번째 요소: {}", xs[1]);
// `pop`은 벡터에서 마지막 요소를 제거하고 이를 반환합니다
println!("마지막 요소 팝: {:?}", xs.pop());
// 범위를 벗어난 인덱싱은 패닉을 일으킵니다
println!("네 번째 요소: {}", xs[3]);
// FIXME ^ 이 줄을 주석 처리하세요
// 벡터는 쉽게 순회(iterate)될 수 있습니다
println!("xs의 내용:");
for x in xs.iter() {
println!("> {}", x);
}
// 벡터는 반복 횟수가 별도의 변수(`i`)에 열거되면서 순회될 수도 있습니다
for (i, x) in xs.iter().enumerate() {
println!("{} 위치에 {} 값이 있습니다", i, x);
}
// `iter_mut` 덕분에 가변 벡터도 각 값을 수정할 수 있는 방식으로
// 순회될 수 있습니다
for x in xs.iter_mut() {
*x *= 3;
}
println!("업데이트된 벡터: {:?}", xs);
}
더 많은 Vec 메서드는 std::vec 모듈에서 찾을 수 있습니다