순수하게 질문에 대답하기 위해 반복자를 사용할 수 있습니다.
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
for 루프에서 벡터의 내용을 수정하려면 iterator
대신const_iterator
.
그러나 이것에 대해 말할 수있는 것이 더 많이 있습니다. 당신이 사용할 수있는 대답을 원한다면 여기서 멈출 수 있습니다. 그렇지 않으면 계속 읽으십시오.
자동 (C ++ 11) / typedef
이것은 다른 해결책이 아니라 위의 iterator
해결책에 대한 보충 입니다. C ++ 11 표준 (이상)을 사용하는 경우 auto
키워드를 사용 하여 가독성을 높일 수 있습니다 .
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
그러나의 유형은 i
상수가 아닙니다 (즉, 컴파일러는 std::vector<char>::iterator
의 유형으로 사용합니다 i
).
이 경우 typedef
C ++ 11에 국한되지 않고 어쨌든 사용하는 것이 매우 유용합니다.
typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
카운터
물론 정수 유형을 사용하여 for
루프 에서 위치를 기록 할 수 있습니다 .
for(int i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
이 작업을 수행하려는 경우 컨테이너의 멤버 유형이 사용 가능하고 적절하다면 사용하는 것이 좋습니다. 이 작업에 대한 std::vector
멤버 유형 size_type
이 size
있습니다. 메소드가 리턴 한 유형 입니다.
// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
왜 iterator
솔루션 보다 이것을 사용하지 않습니까? 간단한 경우도 가능하지만 요점은 iterator
클래스 가이 솔루션이 이상적이지 않은보다 복잡한 객체를 위해이 작업을 수행하도록 설계된 객체라는 것입니다.
범위 기반 for 루프 (C ++ 11)
Jefffrey의 솔루션을 참조하십시오 . C ++ 11 이상에서는 for
다음과 같은 새로운 범위 기반 루프를 사용할 수 있습니다 .
for (auto i: path)
std::cout << i << ' ';
이후 path
항목 (명시 적으로의 벡터이다 std::vector<char>
), 객체가 i
벡터의 항목의 유형입니다 (즉, 명시 적으로,이 유형이다 char
). 개체 i
는 개체 의 실제 항목의 복사 본인 값을 갖습니다 path
. 따라서 i
루프의 모든 변경 사항 path
자체 는 유지되지 않습니다 . 또한 i
루프에서 복사 된 값을 변경하고 싶지 않다는 사실을 적용 하려면 유형 i
을 다음 const char
과 같이 강제 설정할 수 있습니다 .
for (const auto i: path)
std::cout << i << ' ';
의 항목을 수정하려면 path
참조를 사용할 수 있습니다.
for (auto& i: path)
std::cout << i << ' ';
그리고 수정하고 싶지 않더라도 path
객체 복사가 비싼 경우 값으로 복사하는 대신 const 참조를 사용해야합니다.
for (const auto& i: path)
std::cout << i << ' ';
표준 :: 복사
참조 여호수아의 대답을 . STL 알고리즘 std::copy
을 사용하여 벡터 내용을 출력 스트림에 복사 할 수 있습니다 . 이것은 편안하다면 우아한 솔루션입니다 (그리고 벡터의 내용을 인쇄하는 경우뿐만 아니라 매우 유용합니다).
std :: for_each
Max의 솔루션을 참조하십시오 . 사용 std::for_each
이 간단한 시나리오에 대한 잔인한 사람이지만, 그냥 화면으로 인쇄하는 것보다 더 많은 일을하기를 원한다면 매우 유용한 솔루션입니다 : 사용 std::for_each
당신이 할 수 있는 벡터 내용에 (분별) 작업을.
과부하 ostream :: operator <<
Chris의 답변을 참조하십시오 . 오버로드에서 위의 솔루션 중 하나를 여전히 구현해야하기 때문에 이것은 다른 답변에 대한 보완입니다. 그의 예제에서 그는 for
루프 에서 카운터를 사용했습니다 . 예를 들어 다음과 같이 Joshua의 솔루션을 빠르게 사용할 수 있습니다 .
template <typename T>
std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
if ( !v.empty() ) {
out << '[';
std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
out << "\b\b]";
}
return out;
}
다른 솔루션의 사용법은 간단해야합니다.
결론
여기에 제시된 모든 솔루션이 작동합니다. "최고"의 코드는 사용자에게 달려 있습니다. 이것보다 더 자세한 것은 아마도 찬반 양론이 적절하게 평가 될 수있는 또 다른 질문에 가장 적합한 것입니다. 그러나 항상 사용자 환경 설정이 항상 역할을합니다. 제시된 솔루션 중 어느 것도 잘못되지 않지만 일부는 각 개별 코더에 더 좋아 보일 것입니다.
추가
이것은 내가 게시 한 이전 솔루션의 확장 솔루션입니다. 그 게시물이 계속 주목을 받고 있기 때문에 나는 그것을 확장하기로 결정하고 여기에 게시 된 다른 우수한 솔루션을 참조하기로 결정했습니다. 내 원래의 게시물은 경우 그 언급 한 발언했다 있었다 , 안쪽 당신의 벡터 수정에 대한 의도 for
다음이에서 제공하는 두 가지 방법이 있습니다 루프 std::vector
: 액세스 요소에 std::vector::operator[]
범위 검사를하지 않으며 std::vector::at
않는 범위 검사를 수행. 즉, at
벡터 외부의 요소에 액세스하려고 시도하면 operator[]
그렇지 않습니다. 나는 누군가가 이미 모르는 경우에 유용 할 수있는 것을 언급하기 위해 원래이 의견을 추가했다. 그리고 나는 지금 아무런 차이가 없습니다. 따라서이 부록은 다음과 같습니다.