반응형
벡터의 모든 원소들을 순회할 때 인덱스를 사용하거나 Range for문을 사용할 수 있습니다.
하지만 이렇게 하기 어려운 경우들이 있습니다.
vector<int> v = { 3, 1, 8, 9, 12, 2 };
for (int i = 0; i < v.size(); i++)
v.at(i);
for (int k : v)
for k;
맞는 코드는 아니지만 대충 느낌만 보여주고자 이렇게 썼습니다. 정통적인 for문을 사용해주거나 range for 함수를 사용해주시면 되는 것입니다.
이런 복잡한 상황에서는 iterator을 통해 vector을 순회하면 됩니다.
주어진 벡터에서 모든 홀수를 제거하고 모든 짝수에는 2를 곱하라
int main()
{
vector<int> vec{ 10, 8, 1, 5, 4, 6, 11, 2 };
for (int i = 0; i < vec.size(); i++)
{
if (vec[i] % 2 == 0)
vec[i] *= 2;
else {
//not easy to remove vec[i] from the vector
}
}
for (int k : vec) {
if (k % 2 == 0)
k *= 2;
}
}
정통적인 for문 혹은 range for 함수를 이용하려고 하니 쉽지가 않습니다. 물론 할 수는 있지만 과정이 너무 복잡하고 이럴 경우 iterator를 이용해준다면 더 간편하게 풀 수 있는데요.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec{ 10, 8, 1, 5, 4, 6, 11, 2 };
vector<int>::iterator it = vec.begin();
while (it != vec.end())
{
if (*it % 2 == 0)
{
*it *= 2;
it++;
}
else
it = vec.erase(it);
}
for (auto it = vec.begin(); it != vec.end(); it++)
cout << *it << " ";
cout << endl;
return 0;
}
이렇게 vector<int>::iterator를 걸어준 다음데 vec.bein() 부터 시작을 해줍니다.
그 다음 while문으로 iterator가 end가 되기 전까지 it %2 == 0 즉 짝수이면 *2를 해주는 것을 만들어줍니다. 그리고 홀수이면 vec.erase(it); 을 통해 삭제를 해주는 것입니다.
그리고 삭제한 원소 다음으로 it은 이동하게 됩니다. 이런 식으로 해준다면 쉽게 원소를 삭제하고 곱해주는 것을 구해줄 수 있습니다.
for (auto it = vec.begin(); it != vec.end(); it++)
cout << *it << " ";
cout << endl;
그 다음 it를 통해서 계속해서 iterator를 출력해주면 됩니다.
반응형
'IT 프로그래밍 > C++' 카테고리의 다른 글
[따배시 6.9] 포인터 연산과 배열 인덱싱 (0) | 2024.03.29 |
---|---|
C++ [포인터 개념 정리] (0) | 2024.03.26 |
vector insert, erase 정리 (0) | 2024.03.25 |
[따배시 6.5] 정적 다차원 배열 (0) | 2024.03.25 |
[따배시 5.7 ~ 5.8] 반복문 for, break, continue (0) | 2024.03.23 |