티스토리 뷰
C++ 반복자 , lower_bound, sort, unique, erase...
둠드 2020. 9. 23. 14:24반복자(Iterator)란 자료 구조의 원소를 가리키는 변수다.
lower_bound 와 upper_bound
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#define vi vector<int>
using namespace std;
int main() {
vi v = { 1,1,1,1,2,3,3,4,5,7,8,8,8 };
auto a = lower_bound(v.begin(), v.end(), 5);
auto b = upper_bound(v.begin(), v.end(), 5);
cout << *a << " " << *b << "\n";
}
lower_bound는 특정 값 이상인 첫 번째 원소의 반복자를 반환
upper_bound는 특정 값 보다 큰 첫번째 원소의 반복자를 반환
-> 반복자의 값는 위치를 가리키기 때문에 값을 확인하려면 *변수를 사용한다.
-> 벡터가 정렬이 되어있어야 원하는 결과를 얻을 수 있다.
실행결과 : 5 7
sort unique erase
sort(v.begin(), v.end());
auto a = unique(v.begin(), v.end());
sort는 반환 값이 없으며 벡터의 원소를 정렬한다.
unique는 정렬된 원소의 중복을 확인할 수 있다.
unique 함수의 반환 값은 중복없이 나열된 마지막 원소 다음의 반복자다.
vector가 {1,2,3,4,1,2,3,5,2 } 라면
sort의 결과는 1 1 2 2 2 3 3 4 5
unique의 결과는 1 2 3 4 5 3 3 4 5 이다.
따라서 unique 함수의 반환 값은 3 의 반복자를 갖는다.
v.erase(a, v.end());
이어서 erase 함수는 시작 위치부터 끝 위치를 지정하고 해당 범위의 원소를 삭제한다.
따라서 위의 출력 결과는 1 2 3 4 5 가 될 것이다.
주의할 점 중의 하나는 end()는 마지막 원소 다음 위치를 가리킨다.
auto b = v.end(); b--;
printf("%d ", *b);
따라서 마지막 원소를 확인하려면 위와 같이 한 칸 앞으로 빼줘야 정확한 마지막 원소 값을 구할 수 있다.
정렬 옵션 설정
bool comp(string a, string b) {
if (a.size() == b.size()) return a < b;
else return a.size() < b.size();
}
위의 코드는 문자열을 먼저 길이 순으로, 길이가 같으면 알파벳 순으로 정렬한다.
-> sort(v.begin(), v.end(), comp); 이런식으로 콜백 함수 형태로 전달 가능
struct point{
int x, y;
bool operator< (const point& p) {
if (x == p.x) return y < p.y;
else return x < p.x;
}
};
위의 코드는 vector는 아니지만, x, y 값을 가지는 좌표의 < 연산자를 정의한다.
x 값이 같다면 y값을 비교한다.
벡터 값 출력
벡터의 원소 값들을 출력하고 싶을때,
for (auto x : v) {cout << x << " ";}
간단하게 위와 같은 반복문을 사용하여 짧게 표현할 수 있다.
'Programming Languages > C++ & Algorithm' 카테고리의 다른 글
c++ 재귀 알고리즘을 이용한 조합(combination) 생성 (0) | 2020.09.28 |
---|---|
c++ 2차원 동적배열의 참조에 의한 호출 (0) | 2020.09.24 |
재귀 함수를 이용한 순열 생성 알고리즘 (0) | 2020.09.21 |
[Algorithm] 입출력 파일 열기 (0) | 2020.09.19 |
재귀 함수를 이용한 부분 집합 생성 알고리즘 (0) | 2020.09.18 |