Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

はじめてのC++ 【48日目】

More than 1 year has passed since last update.

はじめに

C++の勉強に加えて、Webアプリケーションの勉強も始めることになりました。同時並行は良くないといいますが、諸事情により仕方がないことなので、2つともしっかりとやろうと思います。
Webアプリケーションの学習方法としては、実際に作りながら覚えていく形式で行おうと思います。

Atcoder ABC128

ABC128では、A問題しか解けなかった。まじめに復習していこうと思う。

B問題

いまAtcoderのサイトがメンテ中なのであとで問題は追記します。レストランを並び替える問題。

これが私が書いたコードです。さっぱりわかんなかったです。辞書順ソートとかのやり方がさっぱりわかりませんでした、、、。

B問題(不正解)
#include <iostream>
#include <vector>
#include <string>
int main()
{
  int N = 0;
  std::cin >> N;

  std::vector<std::string> S;
  std::string s;
  std::vector<int> P;
  int p = 0;
  for(int i = 0; i < N; i++)
  {
    std::cin >> s;
    S.emplace_back(s);
    std::cin >> p;
    P.emplace_back(p);
  }
  for(int i = 0; i < N; i++)
  {
    printf("_______________________\n" );
    std::cout << "S[" << i << "] の値は" << S[i]<< std::endl;
    std::cout << "P[" << i << "] の値は" << P[i]<< std::endl;
  }
  return 0;
}

youtubeのAtcoder公式チャンネルの解説を観てみると、 tuple という機能を使っていました。
tuple を簡単に説明すると、 std::pair の従兄弟みたいな感じです。 std::pair は組み合わせを2つしか作れなかったけど、 std::tuple では、いくつでも組み合わせを作ることができます。
また、辞書順ソートは std::sort できるみたいです。 動的配列に std::tuple のソートをしたときは、第一引数みたいなところから順にソートするようになっています。しかし、この問題では、第二引数の p (int型) においては降順にしなければなりません。この場合は、汚いやり方になってしまいますが、値を動的配列に格納するときに、符号を逆転させることで第二引数のソート部分だけを降順にさせることができました。

B問題(正解)
#include <iostream>
#include <string>
#include <tuple>
int main()
{
  int n = 0;
  std::string s;
  int p = 0;
  std::vector< std::tuple< std::string, int , int > > a;

  std::cin >> n;

  for(int i = 1; i <= n; i++)
  {
    std::cin >> s >> p;
    p = -p; // <-重要!!
    a.emplace_back( std::tie(S,P,i) );
  }

  std::sort( a.begin(), a.end() );

  for(int i = 0; i < N-1; i++)
  {
    std::string s;
    int p;
    int id;
    tie( s, p, id ) = a[i];
    std::cout << id << std::endl;
  }

  return 0;
}

(注意)私の環境が悪いのかわかりませんが、コンパイルエラ- がでます。原因はまた明日調べようと思います。

ロベールのC++

みなさまコメントありがとうございます!
明日また読ませていただきます。

静的メンバ変数の使い所

静的メンバ変数は、必ず一つしか生成されない。これは、変数を共有するのには便利だがクラスのモジュール性を大きく低下させてしまう。クラスのモジュール性とは、簡単に言ったらクラスごとに役割を独立させて部品のように扱うってことかな(あんまり理解してないのでリンク貼らせてもらっています)
詳しくはこちら

では、どういうときに静的メンバ変数を使うのかというと、クラスの実体の数を数えるときにとても便利に働いてくれます。
とりあえずコードを書いてみます。

B.cpp
#include <iostream>

class B {
public:
  B();
  virtual ~B();
  void show();
private:
  static int m_count;
};

int B::m_count;//静的変数は0で初期化される

B::B()
{
  m_count++;
}
B::~B()
{
  m_count--;
}

void B::show()
{
  std::cout << m_count << std::endl;
}

int main()
{
  B a;
  a.show();
  {
    B b;
    a.show();
    b.show();
  }//bのデストラクタを呼んでいる
  a.show();
}
実行結果
1
2
2
1

終わりに

ロベールもいつのまにか半分過ぎてた!頑張ろ!
Webは明日からやる!

suponji
エージェント開発・Webアプリ開発をしてました. これから、研究を通してロボット系をやります.
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away