어차피 선형의 시간복잡도라면 힘들게 for문 만드는거 보다
이걸 쓰는게 더 생선적인거 같아 잊지 않기 위해 기록해 둔다.
필요한 해더로는
#include <iostream> //->이건 단순히 프린트 용
#include <algorithm> // find 등의 시퀀스 알고리즘 관련된 듯
#include <vector> // 여기서는 벡터만 이용
using namespace std;
0. 어떤 것들이 있을까?
find, find_if
//////////////////////////////////////////////////////////////////////////////////////////////
1. find
//벡터의 시작, 끝, 찾고싶은 값을 이용해 해당 것을 찾아냄
main
{
vector<int> number;
number.push_back(10);
number.push_back(20);
number.push_back(30);
vector<int>::iterator iter = find(number.begin(), number.end(), 10);
cout<< "찾은것: "<< *iter << endl;
}
//////////////////////////////////////////////////////////////////////////////////////////////
2. find_if
//조건을 담은 별도의 함수 이용, 이 함수는 bool 값을 리턴
//벡터를 순회하며 최초의 true값인 것을 찾아낸다.
->별도의 함수
bool BiggerThan30(int i)
{
//if문도 필요 없구나....
return ( i > 30);
}
main
{
vector<int> number;
number.push_back(10);
number.push_back(60);
number.push_back(20);
number.push_back(30);
vector<int>::iterator iter = find_if(number.begin(), number.end(), BiggerThan30);
cout<< "찾은것: "<< *iter << endl;
}
//////////////////////////////////////////////////////////////////////////////////////////////
3. adjacent_find
//동일원소가 이웃하고 있으면 그 첫번째 원소의 이터레이터를 리턴한다.
main
{
vector<int> number;
number.push_back(10);//1
number.push_back(70);//2
number.push_back(30);//3
number.push_back(20);//4
number.push_back(20);//5
number.push_back(10);//6
vector<int>::iterator iter = adjacent_find(number.begin(), number.end());
cout<<"찾은것: "<< *iter <<endl;
cout<<"다음것: "<< *(++iter) <<endl;
iter = adjacent_find(number.begin(), number.end(), greater<int>() );
cout<<"여기에 들어갈 값: "<< *iter <<endl;
}
첫번째는 4번을 리턴한다. 비조건자 버전은 비교시 string::operator== 를 사용해서 동일 원소가 인접한 첫번째 쌍의 첫번째 원소를 찾는다.
두번째는 조건자 greater<int>()를 사용하여 비교 수행 ( current > right ? ) 고로 첫번째로
오른쪽 보다 큰 값 70이 리턴된다.
//////////////////////////////////////////////////////////////////////////////////////////////
4. count
// 특정 값과 일치하는 원소의 개수를 세는 알고리즘
bool Func(int i)
{
return (i % 20 == 0);
}
main
{
vector<int> number;
number.push_back(10);
number.push_back(20);
number.push_back(30);
number.push_back(20);
number.push_back(20);
number.push_back(10);
int c = count(number.begin(), number.end(), 20);
int c = count(number.begin(), number.end(), 20);
cout<<"20의 개수: "<< c <<endl;
int c_if = count_if(number.begin(), number.end(), Func);
cout<<"20으로 똑 나누어 떨어지는것 개수: "<< c_if <<endl;
}
//////////////////////////////////////////////////////////////////////////////////////////////
5. for_each
//stl 원소들을 순회
void Print(int i)
{
cout<< i <<endl;
}
main
{
vector<int> number;
number.push_back(10);
number.push_back(20);
number.push_back(30);
number.push_back(20);
number.push_back(60);
number.push_back(10);
for_each(number.begin(), number.end(), Print);
}
//////////////////////////////////////////////////////////////////////////////////////////////
5. equal , mismatch
//stl 간 비교 시 쓰임
#include <string>// 추가
main
{
vector<string> aVector;
vector<string> bVector;
vector<string> cVector;
aVector.push_back("A");
aVector.push_back("B");
aVector.push_back("C");
bVector.push_back("A");
bVector.push_back("B");
bVector.push_back("C");
bVector.push_back("D");
cVector.push_back("A");
cVector.push_back("D");
if( equal(aVector.begin(), aVector.end(), bVector.begin()) == true )
{
int size = aVector.size();
cout<< "aVector와 bVector의 처음 " << size << "개의 원소 일치"<< endl;
}
else
{
cout<< "aVector와 bVector는 같지 않습니다."<< endl;
}
//위에서 처럼 기준이 되는 aVector의 원소의 개수(size)가 bVector의 것과 다를 경우
//앞의 세개가 같아도 결국 같은 내용을 담고 있다는 것을 보증할 수 없으니
//내용 비교 전 사이즈 비교를 해줘야 한다.
if( aVector.size() == bVector.size() &&
equal(aVector.begin(), aVector.end(), bVector.begin())
{
//같음
}
else
{
//다름
}
pair<vector<string>::iterator, vector<string>::iterator>
if( p.first != cVector.end() )
{
cout<< "첫 불일치 리스트 cVector의 "<< *p.first<<
" 와 aVector의 "<< *p.second << endl;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
6. search
// 두 stl 간에 들어있는 데이터의 시퀀스가 일치하는 부분이 있으면 그 첫 시작점의 이터레이터를 리턴한다.
#include <deque>//추가
main
{
vector<int> vector1(20);
deque<int> deque1(5);
for(int i=0; i< 20; ++i)
{ vector1[i] = i; }
for(int i=0; i<5; ++i)
{ deque1[i] = i+5; }
//vector1에서 deque에 들어있는 내용과 같은 부분을 찾겠다는 것임
vector<int>::iterator iter =
search(vector1.begin(), vector1.end(), deque1.begin(), deque1.end());
int count = deque1.size();
for(int i=0; i<count; ++i)
{
cout<< *(iter+i) <<endl;
}
}
댓글 없음:
댓글 쓰기