2 minute read

🏫Chapters 4 : Computation

📖Vector

  • size() : 자기 자신의 크기를 가지고 있는 함수, 일단 포인터로 배열을 가지고 있다가 새로운 배열을 가지게 되면 갈아타기 위해 포인터를 가지고 있음

  • Template 템플릿 : 어떤 클래스를 만들 때, 어떤 데이터 타입을 지원할지에 따라 클래스가 별도로 있어야 한다. 그러나, 이는 바람직하지 않으므로 하나로 쓰고 싶지만 지원하는 자료형은 달라야하므로 템플릿을 사용한다.

    • vector<T> 에서 T에 다양한 타입을 집어넣을 수 있다. 그 타입에 대한 벡터가 자동으로 생성된다.

📖Vectors

  • vector<int> v; : 빈 벡터

  • v.push_back() : . 은 v의 멤버 변수를 호출한다. 이때 v가 포인터이면 ->를 사용한다.

fail to bring

  • 예제 1

      // compute mean (average) and median temperatures:
    
      int main()
      {
          vector<double> temps; // temperatures in Fahrenheit, e.g. 64.6
          double temp;
            
          while (cin>>temp) temps.push_back(temp); // read and put into vector
            
          double sum = 0;
          for (int i = 0; i< temps.size(); ++i) sum += temps[i]; // sums temperatures
            
          cout << "Mean temperature: " << sum/temps.size() << '\n';
          sort(temps); // from std_lib_facilities.h
            
          // or sort(temps.begin(), temps.end());
          cout << "Median temperature: " << temps[temps.size()/2] << '\n';
    
    
    • 배열과 달리 벡터는 얼마든지 내용이 들어올때마다 push_back 할 수 있다.

    • 연산자 오버로딩을 통해 [ ]를 똑같이 쓸 수 있다.

    • sort() C++이 기본으로 제공해주는 함수이다. 원래 제대로 된 문법은 sort(temps.begin(), temps.end()); 이다.


📖Traversing a vector

  • 리스트로 벡터를 초기화 해줄 수 있다.

  • for (int i = 0; i< v.size(); ++i) cout << v[i] << '\n'; 는 클래식한 방법이고 같은 일을 수행하도록 for (int i : v) cout << x << '\n'; 도 쓸 수 있다.

  • 예제 2

      #include<vector>
      #include<string>
      #include<algorithm>     // sort()함수를 가지고 있음
    
      using namespace std;
    
      int main(){
          vector<string> words;       // string 가능
            
          for (string s; cin>>s && s != "quit";) // && means AND
              words.push_back(s);
    
          sort(words); // sort the words we read
            
          for (string s : words)  // for(int i = 0; i < words.size(); i++) 이것과 같음
              cout << s << '\n';
      }
    
    
  • 예제 3 중복된 문자열은 한번만 출력하고 싶을 때

      #include<vector>
      #include<string>
      #include<algorithm>     
    
      using namespace std;
    
      int main(){
          vector<string> words;
         
          for (string s; cin>>s && s!= "quit"; ) 
             words.push_back(s);
            
          sort(words);
            
          vector<string>w2;
            
          if (0<words.size()) { // note style { }
              w2.push_back(words[0]);
            
              for (int i=1; i<words.size(); ++i) // note: not a range-for
                  if(words[i-1]!=words[i])
                      w2.push_back(words[i]); 
          }
            
          cout<< "found " << words.size()-w2.size() << " duplicates\n";
            
          for (string s : w2)
              cout << s << "\n";
      }
    
    • 새로운 벡터를 하나 더 만들어 사용하는 방법을 사용한다. 입력받은 벡터를 정렬해준 뒤, 새로운 벡터에 첫번째 문자부터 넣어준다. 이 때, push_back되는 문자열이 그 전 문자열과 같지 않을 때만 수행한다. 이렇게 되면 새로 만든 벡터에는 중복되는 문자열이 없게 된다.

💻실습2

    #include <vector>
    #include <algorithm>
    #include <iostream>

    using namespace std;


    bool solution(vector<int> arr)
    {
        vector<int> count;
        
        for(int i=0; i < arr.size(); i++) 
            count.push_back(0);
        
        for (int i = 0; i < arr.size(); i++) {
            if (arr[i] <= count.size()) {
                count[arr[i]-1]++;
            }
        }
        
        for (int i = 0; i < arr.size(); i++){
            if(count[i] != 1){
                return false;
            }
        }
        return true;
    }