지난 금요일, 학교에서 PL 수업 시간중에.. "루비는 열라 막 짱임. 과제를 날로 먹을 수 있음!" 뭐 이런 내용에 대해서 발표를 했더랬습니다. 그러면서 예로 들었던 코드가,
a = [99, "hello", "ruby", 2.17]
a.each { |x| puts x }
요렇게 한줄로, a 배열을 순차적으로 찍을 수 있다는 내용이 있었는데요. C++도 물론 C++0x에선 람다를 지원할 예정이기 때문에,
// vector<int> a일 경우에..
for_each(a.begin(), a.end(), [](int x) { cout << x << endl; } );
이렇게 람다를 섞으면, 한줄로 모든 항목을 한줄씩 뿜을 수 있긴 한데, 단지 출력만 할 경우라면, 이미 현재의 C++ 표준 문법에서도 가능한 더 깔끔한 방법이 있었습니다. ostream_iterator라는 녀석이 그것인데, 아래 코드는 위 코드와 같은 동작을 보입니다.
copy(a.begin(), a.end(), ostream_iterator<int>(cout, "\n"));
벡터가 아닌 int 배열이라면, 아래 처럼.. (배열도 시퀀셜 컨테이너에 적용되는 알고리즘들이 대부분 사용 가능합니다.)
int a = { 99, 123, 543, 12, -4, 6 };
copy(&a[0], &a[6], ostream_iterator<int>(cout, "\n"));
주의할 점이랄까, copy 알고리즘의 두번째 매개변수는 마지막 칸의 다음칸의 주소이기 때문에, &a[6]이 맞습니다. STL의 모든 알고리즘은 범위가 [a, b) 이거든요. b는 포함되지 않는.
-- Jong10
p.s. ostream_iterator는 오늘 처음 본 줄 알았는데.. TC++PL에 있더군요;; 기억이 없..=3=3





