아니요, 올바른 방법이 아닙니다. ::std::vector
또는 ::std::string
의 경우 제대로 작동하지만 문제는 다른 것을 사용하면 잘 작동하지 않는다는 것입니다. 또한, 관용적이지 않습니다.
그리고 다른 질문에 대답하십시오 ... size
함수가 아마도 인라인입니다. 즉, 또는 ::std::vector
의 내부 값을 가져올 가능성이 높습니다. 컴파일러는이를 최적화하고 대부분의 경우 한 번만 가져옵니다.
for (::std::vector<Foo>::iterator i = theContainer.begin();
i != theContainer.end();
++i)
{
Foo &cur_element = *i;
// Do stuff
}
++i
은 매우 중요하다
는하지만, 여기에 관용적 인 방법입니다. 다시 말하지만, 반복자가 기본적으로 포인터 인 ::std:vector
또는 ::std::string
의 경우 중요하지 않습니다. 그러나보다 복잡한 데이터 구조의 경우 그렇습니다. i++
은 이전 값을 고수해야하기 때문에 복사본을 만들어 임시로 만들어야합니다. ++i
에는 아무런 문제가 없습니다. 설득력있는 이유가없는 한 항상 ++i
을 사용하는 습관을 가지십시오.
마지막으로 theContainer.end()
은 일반적으로 존재하지 않도록 최적화됩니다. 그러나이 수행하여 조금 더 나은 물건을 강제 할 수
for (Foo &i: theContainer)
{
// Do stuff with i
}
이 것 : 물론
const ::std::vector<Foo>::iterator theEnd = theContainer.end();
for (::std::vector<Foo>::iterator i = theContainer.begin(); i != theEnd; ++i)
{
Foo &cur_element = *i;
// Do stuff
}
을, C++ 0X 상당히 for
루프에 대한 새로운 구문이 모든 것을 단순화 표준 픽스 크기의 배열뿐만 아니라 begin
및 end
을 정의하여 반복자와 같은 것을 반환하는 모든 유형에서 작동합니다.
'unsigned int'대신 'size_t'를 사용해야합니다. – Maxpm
@Maxpm - 또는 더 나은 것은':: std :: vector :: size_type'입니다. –
Omnifarious
begin() 및 end()는 O (1)의 복잡성을 보장합니다. 크기는 일반 컨테이너에 대해서만 O (n)의 보증을 갖지만 (문자열과 벡터는 일반에 비해 추가 보증을 할 수 있음) –