프로그래밍 언어/C++

std :: vector에 대한 반복 : unsigned 변수와 signed 변수

Rateye 2021. 11. 17. 10:49
728x90
반응형
질문 : std :: vector에 대한 반복 : 부호없는 색인 변수와 부호있는 색인 변수

C ++에서 벡터를 반복하는 올바른 방법은 무엇입니까?

다음 두 코드 조각을 고려하면이 코드는 잘 작동합니다.

for (unsigned i=0; i < polygon.size(); i++) {
    sum += polygon[i];
}

그리고 이것:

for (int i=0; i < polygon.size(); i++) {
    sum += polygon[i];
}

warning: comparison between signed and unsigned integer expressions 를 생성합니다.

저는 C ++의 세계에 처음 왔기 때문에 unsigned 변수는 나에게 약간 무섭게 보이며 unsigned 변수가 위험 할 수 있다는 것을 알고 있습니다. 맞습니까?

답변

거꾸로 반복하려면 this answer를 참조하십시오.

순방향 반복은 거의 동일합니다. 반복기 / 스왑 감소를 증분으로 변경하십시오. 반복자를 선호해야합니다. 어떤 사람들은 std::size_t 를 인덱스 변수 유형으로 사용하라고 말합니다. 그러나 그것은 이식성이 없습니다. 항상 사용 size_type 당신이 앞으로 반복하는 경우에만 변환 넘어갈 수 있지만 컨테이너 (의 형식 정의를 사용하는 경우, 실제로는 뒤로 반복하는 경우에 모든 방법을 잘못 갈 수 std::size_t 경우에, std::size_t size_type 의 typedef보다 넓습니다) :

Using std::vector

Using iterators

for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
    /* std::cout << *it; ... */
}

중요한 것은 정의를 모르는 반복자에 대해 항상 접두사 증분 양식을 사용한다는 것입니다. 그러면 코드가 가능한 한 일반적으로 실행됩니다.

Using Range C++11

for(auto const& value: a) {
     /* std::cout << value; ... */

Using indices

for(std::vector<int>::size_type i = 0; i != v.size(); i++) {
    /* std::cout << v[i]; ... */
}

Using arrays

Using iterators

for(element_type* it = a; it != (a + (sizeof a / sizeof *a)); it++) {
    /* std::cout << *it; ... */
}

Using Range C++11

for(auto const& value: a) {
     /* std::cout << value; ... */

Using indices

for(std::size_t i = 0; i != (sizeof a / sizeof *a); i++) {
    /* std::cout << a[i]; ... */
}

sizeof 접근 방식이 어떤 문제를 일으킬 수 있는지 역방향 반복 답변에서 읽으십시오.

출처 : https://stackoverflow.com/questions/409348/iteration-over-stdvector-unsigned-vs-signed-index-variable
728x90
반응형