2015년 6월 4일 목요일

STL 시퀀스 알고리즘

참고 사이트
어차피 선형의 시간복잡도라면 힘들게 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>
p = mismatch(cVector.begin(), cVector.end(), aVector.begin());
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;
}
}

댓글 없음:

댓글 쓰기