티스토리 뷰

반복자(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 << " ";}

간단하게 위와 같은 반복문을 사용하여 짧게 표현할 수 있다.

 


 

댓글
반응형
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함