BETA

C++のvectorとCの配列で戸惑った件

投稿日:2019-05-27
最終更新:2019-05-27

経緯

  • ABC 128 B問題にて,C++で多次元配列かつ,複数のkeyでソートする必要がでてきてパニクる

勘違い

  • 最初に書いたコード(これだと動かない)

    int main() {  
    
      pair<pair<string, int>, int> p;  
    
      int N;  
      cin >> N;  
    
      for (int i = 0; i < N; ++i) {  
          string in;  
          int t;  
          cin >> in >> t;  
          p[i] = make_pair(make_pair(in, -t), i));  
      }  
    
      sort(p.begin(), p.end());  
      for (int i = 0; i < N; i++) {  
          cout << p[i].second + 1 << endl;  
      }  
    }  

だめなところとしては,

  • C言語の配列で定義しているのに,可変長として処理しようとしている
  • イテレータとポインタが理解できていない(イテレータで参照しようとしている)

解決策

  • C言語の配列を利用して処理するならば以下
int main() {  


    string in;  
    pair<pair<string, int>, int> p[110];  

    int N;  
    cin >> N;  


    for (int i = 0; i < N; ++i) {  
        int t;  
        cin >> in >> t;  
        string temp = in;  
        p[i] = make_pair(make_pair(in, -t), i);  
    }  

    sort(p, p + N);  
    // sort(p.begin(), p.end());  
    for (int i = 0; i < N; i++) {  
        cout << p[i].second + 1 << endl;  
    }  


}  
  • C++のライブラリ(vector)を利用するならば以下

int main() {  


    string in;  
    vector< pair <pair <string, int>, int> > p;  

    int N;  
    cin >> N;  


    for (int i = 0; i < N; ++i) {  
        int t;  
        cin >> in >> t;  
        string temp = in;  
        p.push_back(make_pair(make_pair(in, -t), i));  
    }  

     sort(p.begin(), p.end());  
    for (int i = 0; i < N; i++) {  
        cout << p[i].second + 1 << endl;  
    }  

}  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@platoの技術ブログ 某大学の学生です

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう