質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

630閲覧

atcoderのC++言語のset<int>の<int>の箇所について理解したいが、何を調べたらよいかわからない

ratera

総合スコア54

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/05 06:45

編集2020/07/05 15:20

atcoderで、set<int> values;greater<int>()のような記法をみました。
<int>について調べてみたのですが、ポイントが掴めずどういう記法なのかわかりません。

これを教えていただくか、良いサイト・調べるための単語を教えてください。
また、標準ライブラリ(sort())などを調べる際に良いサイトがありましたら、こちらも教えてほしいです

宜しくお願いします。

参考:
https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-6-%E5%95%8F--abc-088-b---card-game-for-two-200-%E7%82%B9
http://vivi.dyndns.org/tech/cpp/set.html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2020/07/05 06:56

ずまりC++の「テンプレート」について 1. 言葉は知っている or 初耳です。 2. (1.で知っている場合) どういうものか知っている or どんなのか知らない 3. (2.で知っている場合) 書き方とかも知っている or 書き方とかは知らない のどの段階ですか?
angel_p_57

2020/07/05 07:21

あとはプラスして、 * 他の言語で実装する際の参考にしたいがC++がよく分からない → その場合使う言語は何か * C++で自身でも実装したいがよく分からない のどちらなのかも重要でしょうね。 なお、atcoder という意味だと、使用されている記法は「競技プログラミング」に最適化されている部分もあって、必ずしも汎用的にC++で実装する際に好ましくないものもありますので ( `using std;` とか `#include <bits/stdc++.h>` とか )、その点注意が必要です。
SHOMI

2020/07/05 08:21

タグがC++ではなくCになっていますよ。
ratera

2020/07/05 13:25 編集

皆さまありがとうございます。 関数テンプレートで検索したら出ました。 @raccy 1になります。テンプレート(または関数テンプレート)で検索したらヒットしました。まずはこのワードを調べることから始めます。ありがとうございました! >ずまりC++の「テンプレート」について 1. 言葉は知っている or 初耳です。 @angel_p_57 ご回答ありがとうございます。 C++で実装する際の文法がわからず、とっかかりとして何で検索したらよいのかわからない状況でした。 注意事項ありがとうございます。 以下は、不要なヘッダーを呼び出すため、動作が遅くなったりするという認識であっていますか? >必ずしも汎用的に........#include <bits/stdc++.h>とか)、その点注意が必要です @SHOMI ありがとうございます!。 タグはC++でサジェストされなかったので、C言語でも良いかな?とミスリードしてしまいました。 今後、C++で投稿するようにします。 ご紹介いただいたものは、計算量とか書いてあってうれしいです!。 (ただ、第三引数のcomp の使い方が想像できないので修行が必要そうですので頑張ります) https://ja.cppreference.com/w/cpp/algorithm/sort
SHOMI

2020/07/05 13:33

タグや質問はあとからでも編集できます
ratera

2020/07/05 15:20

できました(^^♪
guest

回答2

0

atcoderで、set<int> values;greater<int>()のような記法をみました。
<int>について調べてみたのですが、ポイントが掴めずどういう記法なのかわかりません。

クラステンプレート(class template)のテンプレートパラメータ(template parameter)に対して、具体的な型intを指定しています。

  • std::set<Key, Compare, Allocator>クラステンプレートは3個のテンプレートパラメータをとり、少なくとも1番目のテンプレートパラメータKeyには要素型を指定する必要があります。。(2番目, 3番目は省略可能です。)
  • std::greater<T>クラステンプレートは1個のテンプレートパラメータをとります、テンプレートパラメータTには比較対象の型を指定する必要があります。

クラステンプレートそれ自身は型(type)ではないため、下記のような記述はコンパイルエラーとなります。

c+++

1std::set values; // エラー 2std::greater(); // エラー

クラステンプレートにテンプレートパラメータを指定することで初めて具体的な型となり、変数宣言や一時オブジェクト生成に使えるようになります。

c+++

1std::set<int> values; // std::set<int>型の変数valuesを宣言 2std::greater<int>(); // std::greater<int>型の一時オブジェクト生成

高度なトピック:C++17からクラステンプレートでもテンプレートパラメータ推論がサポートされたため、一部ケースではソースコード上へのテンプレートパラメータ指定が不要となることがあります。あくまで冗長な記述を省略できるようになっただけですから、まずは基本形を理解されてからになると思います。

投稿2020/07/06 11:04

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ratera

2020/07/06 23:42

ご回答ありがとうございます! 本に書かれていること以上に理解が進みました。 基本形の理解してから...については、お言葉に甘えて、慣れて困ったらまた向き合う方向で進めさせていただきます!
guest

0

ベストアンサー

まあ次のような順番で調べていくのがいいと思います。

  1. 関数のオーバーロードとは
  2. templateとは
  3. templateクラスとは
  4. 関数オブジェクトとは
  5. lambda式とは
  6. templateが絡むときに爆発しがちなエラーメッセージを解読する方法(ex. C++20コンセプト時代のエラーメッセージとの付き合い方)

投稿2020/07/05 17:34

編集2020/07/05 17:34
yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ratera

2020/07/06 02:15

ご丁寧にありがとうございます! お陰様で、4番の関数オブジェクトまでは進めました。 5番のlambda式みたいな無名関数というのがあるのですね。 メリットは、わざわざ関数を定義するほどのことがない時に使えるようですが、 関数オブジェクトからの関係についてはピンときていません。 こちらについては、しばらく寝かせて考えたいと思います!
yumetodo

2020/07/06 03:00

lambda式というのは関数オブジェクトを生成するsyntax sugarだと考えると良いです。関数を引数経由で渡すようなときに、関数ポインタでは最適化を阻害しますが、関数オブジェクトならば、型と処理が一対一対応するので最適化を阻害しないという特徴があります。 あー、そういえば5と6の間にparfect forwardingを書くのを忘れた。せっかく作った関数オブジェクトを最速で利用者(呼び出し箇所)に届ける方法でもあります。
ratera

2020/07/06 10:00

なるほど! 関数ポインタだと、アドレスから型がわかりづらいので最適化を阻害するのですね! かんぜんにりかいしました。 syntax sugarの説明に角砂糖の写真やら苺ショートやら飯テロ要素が一杯だあああ なんかCの文法書はある程度読みましたが、別にC++の文法書をちゃんと読まなければならないことがよくわかりました。重ね重ねありがとうございます。
yumetodo

2020/07/06 11:01 編集

関数ポインタというか、ポインタ全般に、何を指しているか解析するのは難しいのです。ポインタは再束縛できるというのもさらに最適化を阻害します。C(C++ではない)ではrestrictキーワードが導入されたのですが、もうすこし知識が増えたら調べてみるといいと思います。たぶん今知るには早すぎます。 https://yohhoy.hatenadiary.jp/entry/20120223/p1 https://yohhoy.hatenadiary.jp/entry/20120229/p1 https://yohhoy.hatenadiary.jp/entry/20120220/p1 https://stackoverflow.com/questions/57259126/why-does-the-rust-compiler-not-optimize-code-assuming-that-two-mutable-reference
ratera

2020/07/06 23:44

ありがとうございます(^^♪ レベルをあげてチャレンジしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問