2017-12-28 54 views
0

함수에 벡터를 전달할 때 함수가 벡터를 수정해서는 안되며, 더 나은 것은 const vector<>을 사용하거나 vector::const_iterator을 사용하는 것입니다.const 벡터와 const 반복자의 차이점

예를 들어, 나는 main()에서 foo()으로 전달 된 벡터를 통과하고 있습니다.

void foo (const vector<int> &v1) { 
vector<int>::const_iterator m; 

for(m=v1.begin();m1!=v1.end();++m1) 
//loop body 

} 

그리고 main()이 경우

int main() { 
vector<int> v11={0,1,2,3,4}; 
foo(v11); 
} 

입니다 v1const해야 또는 mconst_iterator을해야 하는가?

+3

는'v1'가'const'되어야 사용'm'은'auto'해야한다. – DeiDei

+0

왜'v1'은'const'이어야합니까? 그리고'C++ 11 '은'auto' 키워드를 제공합니다. 그러나 명시 적 형식을 지정하는 것이 '자동'과 비교하여 성능이 더 빠르지 않아야합니다. – edf233

+0

@ edf233 : 아니요. '자동'은 순전히 구문 당입니다. 성능에 부정적인 영향을주지는 않습니다. –

답변

5

foo이 인수를 수정하지 못하게하려면 인수를 const으로 가져와야합니다. constconst 참조에서 std::vector 참조가 아닌 conststd::vector::begin의 유효하지 않은 버전에 액세스 할 수 없으므로 이터레이터를 가져올 수 없습니다.

또한 C++ 11 범위의 반복에 대해 반복적으로 표현할 수있는 명확한 방법이 있습니다. 범위는 for입니다. 이 경우

void foo(const vector<int> &v1) 
{ 
    for(const auto& x : v1) { /* use x */ } 
} 
2

, V1은 CONST이어야 또는 m은 const_iterator를해야 하는가?

반복기를 전달하기로 결정하면 시작과 끝이라는 두 개의 인수를 전달해야합니다. 그렇지 않으면 반복을 중단 할시기를 알 수 없습니다.

다음은 작동하지 않습니다.

void foo (vector<int>::const_iterator start) { 
    // for(m=v1.begin();m1!=v1.end();++m1) 
    for (auto m1 = start; m1 != v1.end(); ++m1) // There is no way to compute v1.end(). 

    //loop body 
} 

다음 작업을 수행하십시오. 의미

void foo (vector<int>::const_iterator start, vector<int>::const_iterator end) { 
    for ( auto m1 = start; m1 != end; ++m1) 
    //loop body 
} 

, 당신과 함께 함수를 호출해야합니다 : 벡터의 내용의 부분 집합을 반복하는 지원 할 필요가없는

foo(v11.begin(), v11.end()); 

을 지원 할 필요가 없습니다 이 버전은 foo입니다.

반면에 너무 많은 문제없이 지원할 수 있습니다. 수

void foo (vector<int>::const_iterator start, vector<int>::const_iterator end) { 
    for ( auto m1 = start; m1 != end; ++m1) 
    //loop body 
} 

void foo (vector<int>::const& v) { 
    foo(v.begin(), v.end()); 
} 

당신이

vector<int> v11={0,1,2,3,4}; 
foo(v11); // Do something for all the elements of v11. 
foo(v11.begin(), v11.begin()+2); // Do the same thing only for the first two elements of v11.