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
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
long 형식을 지정하는 printf의 인수 (0) | 2021.11.18 |
---|---|
Reflection을 사용하여 문자열에서 속성 값 가져 오기 (0) | 2021.11.18 |
[C#] 폴더가없는 경우 새로 만드는 방법 (0) | 2021.11.15 |
rvalues, lvalues, xvalues, glvalues, prvalues 사용 방법 (0) | 2021.11.11 |
[C++] private, public 및 protected 상속의 차이점 (0) | 2021.11.04 |