본문 바로가기

C++ Programming/STL

VECTOR

vector - 동적인 배열이며 원소들의 순서가 있으며 랜덤 액세스를 지원한다. 
             - 끝에 원소를 추가하거나 제거한다면 놀라운 성능이나 중간에 데이타 삽입이면 느려진다. 

    a) vector의 성능을 더 끌어올리는 방법은 원소를 저장하기전에 필요한 메모리보다 더 큰 메모리를 확보해 놓는것이다. 
        재할당은 피하기 위해서는 reserve()를 사용하면 된다. 
         ex) std::vector<int> v;
               v.reserve(80); //80개의 원소를 위해 메모리를 확보한다. 
              아니면 std::vector<T> v(5); //vector를 생성하고 5개의 값으로 초기화한다.

    b) vector는 용량이 절대로 줄어들 수 없다. 줄일수 있는 간접적인 방법으로 다른 vector와 원소들은 보호하면서
        교체할 수 있다. 
         
    c) 기존의 값을 없애면서 새로운 값을 할당하는 방법 - assign
          std::list<elem> l;
          std::vector<elem> coll;
          coll.assign(l.begin(),l.end());

     d) 원소 액세스 방법     
         c.at(idx) - 인덱스가 idx의 원소를 반환 - 인덱스범위가 벗어나게 되면 out_of_range예외를 발생
         c[idx] 
         c.front() - 첫번째 원소반환
         c.back() - 마지막 원소반환

      e) 반복자 함수들
         c.begin() ,c.end(), c.rbegin(), c.rend()
      
      f) 원소의 삽입은 여러 번 호출하여 삽입하는것보다 여러 원소들을 한번의 호출로 삽입하는 것이 유리하다. 
         c.insert(pos,elem)  - pos에 elem 삽입
         c.insert(pos,n,elem) - n개의 복사본은 pos에 삽입
         c.insert(pos,beg,end) - 범위의 원소들을 pos에 삽입
         c.erase(pos) - 반복자 pos 위치의 원소를 제거한다. 
         c.erase(beg,end) -  범위의 모든 원소들을 제거한다. 
         c.resize(num) - 원소의 갯수를 num개로 변경한다. 
         c.resize(num,elem) - 원소의 갯수를 num개로 변경한다. 
         c.clear() - 모든 원소들을 제거한다. 
        
          ex) coll.erase(remove(coll.begin(),coll.end(),val),coll.end());
               //val을 값으로 가지는 모든 원소 제거 

          vector<string> sentence;
          sentence.reserve(5);
          sentence.push_back("hello,");
          sentence.push_back("how");
          sentence.push_back("are");
          sentence.push_back("you");
          sentence.push_back("?");

          //공백으로 구분하여 원소를 출력한다.           
          copy(sentence.begin(),sentence.end(),ostream_iterator<string>(cout," "));
          cout << endl;

          //세부 정보를 보여준다. 
          cout << "max_size():"<<sentence.max_size() << endl;
          cout << "size():" << sentence.size() << endl;
          cout << "capacity():" << sentence.capacity() << endl;
          
           //두번째 값과 네번째값을 교체한다. 
           swap(sentence[1],sentence[3]);

           //"?"원소 앞에 "always"를 할당한다.   
           sentence.insert(find(sentence.begin(),sentence.end(),"?"),"always");
        
           //마지막 원소에 "!"를 할당한다. 
           sentence.back() = "!"

       g) vector <bool> 클래스
           c.flip() - 모든 boolean 원소들을 반전한다. 
           m[idx].flip() - 인덱스가 idx인 원소들을 반전시킨다. 
           m[idx] = val - val을 인덱스가 idx인 boolean 원소에 할당한다.
           m[idx1] = m[idx2] - 인덱스가 idx2인 원소의 값을 인덱스가 idx인 boolean 원소에 할당한다.