タグ付けされた質問 「c++14」

C ++ 14は2014年に承認されたC ++標準の名前です。これは以前のC ++ 11標準に基づいて構築されており、コア言語と標準ライブラリを改善し、いくつかの機能を追加しています。

2
現代のC ++でクラシックな並べ替えアルゴリズムを実装する方法は?
std::sortアルゴリズム(そのいとこstd::partial_sortとstd::nth_elementC ++標準ライブラリからの)は、ほとんどの実装である複数の基本ソートアルゴリズムの複雑ハイブリッド融合そのような選択ソート、挿入ソート、クイックソート、マージソート、又はヒープソートなど、。 ここやhttps://codereview.stackexchange.com/などの姉妹サイトには、これらの古典的なソートアルゴリズムの実装のバグ、複雑さ、およびその他の側面に関する多くの質問があります。提供されている実装のほとんどは、生のループで構成され、インデックス操作と具象型を使用しており、正確性と効率性の観点から分析することは一般的に重要です。 質問:上記の古典的な並べ替えアルゴリズムは、最新のC ++を使用してどのように実装できますか? 生のループはありませんが、標準ライブラリのアルゴリズム構築ブロックを組み合わせて<algorithm> イテレータインターフェイスと、インデックス操作や具象型の代わりにテンプレートを使用 完全な標準ライブラリを含むC ++ 14スタイル、autoおよび、テンプレートエイリアス、透過的なコンパレータ、ポリモーフィックラムダなどの構文ノイズリデューサー。 注: ソートアルゴリズムの実装の詳細については、Wikipedia、Rosetta Code、またはhttp://www.sorting-algorithms.com/を参照してください。 ショーン親の規則(スライド39)、生のループであるforオペレータと長い2つの関数の組成より-loop。そうf(g(x));か、f(x); g(x);あるいはf(x) + g(x);生のループではありません、そしてどちらのループしているselection_sortとinsertion_sort以下。 私はスコットマイヤーズの用語に従い、現在のC ++ 1yをすでにC ++ 14として示し、C ++ 98とC ++ 03の両方をC ++ 98として示しています。 @Mehrdadのコメントで示唆されているように、回答の最後にライブ例として4つの実装を提供します。C++ 14、C ++ 11、C ++ 98、BoostおよびC ++ 98です。 答え自体はC ++ 14に関してのみ示されています。必要に応じて、さまざまな言語バージョンが異なる構文とライブラリの違いを示します。

2
最新のC ++でパフォーマンスを無料で取得できますか?
C ++ 11/14は、単にC ++ 98コードをコンパイルする場合でも、パフォーマンスを向上させることができると主張されることがあります。正当化は通常、移動のセマンティクスの線に沿っています。場合によっては、右辺値コンストラクターが自動的に生成されるか、STLの一部となることがあります。今、これらのケースが以前にRVOまたは同様のコンパイラ最適化によって実際にすでに処理されていたかどうか疑問に思っています。 私の質問は、新しい言語機能をサポートするコンパイラを使用して、変更なしでより高速に実行されるC ++ 98コードの実際の例を教えてもらえるかどうかです。コピーの省略を行うのに標準準拠のコンパイラーは必要ないことを理解しています。そのため、移動のセマンティクスによって速度が向上する可能性があります。 編集:明確にするために、私は新しいコンパイラが古いコンパイラよりも高速であるかどうかを尋ねているのではなく、コンパイラフラグに-std = c ++ 14を追加するコードがある場合、それはより高速に実行されます(コピーを避けますが、移動セマンティクス以外に何かを思い付くことができます、私も興味があります)

6
C ++ 11、14、17、または20は、piの標準定数を導入しますか?
CとC ++のpiの数値にはかなりばかげた問題があります。私が知る限り、でM_PI定義されてmath.hいることは、どの規格でも要求されていません。 新しいC ++標準では、標準ライブラリに複雑な数学の多くが導入されました-双曲線関数、std::hermiteおよびstd::cyl_bessel_i、さまざまな乱数ジェネレータなど。 「新しい」標準のいずれかがパイの定数をもたらしましたか?そうでない場合-なぜですか?この複雑な数学はそれなしでどのように機能しますか? 私はC ++のpiに関する同様の質問を認識しています(それらは数年前のものであり、標準から古くなっています); 問題の現状を知りたいのですが。 なぜ C ++にはまだpi定数がないのに、もっと複雑な数学がたくさんあるのか、という理由にも非常に興味があります。 UPD:自分でpiを4 * atan(1)またはacos(1)またはdouble pi = 3.14として定義できることを知っています。承知しました。しかし、なぜ2018年に私はまだそれをしなければならないのですか?標準の数学関数はpiなしでどのように機能しますか? UPD2:2019年7月にケルンで開催されたC ++委員会のこの出張レポートによると、提案P0631(数学定数)がC ++ 20に受け入れられました。つまり、ついに標準ライブラリに数piが含まれるようになります!

8
const参照としてのラムダキャプチャ?
ラムダ式でconst参照によってキャプチャすることは可能ですか? 以下にマークされている割り当てを失敗させたい、例えば: #include <cstdlib> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string strings[] = { "hello", "world" }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = "foo"; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { best_string = s; // this should fail } ); return …
166 c++  c++11  lambda  c++14 

2
decltype(auto)の用途は何ですか?
OverаэтотвопросестьответынаStack Overflowнарусском:Конструкцияdecltype(auto) c ++ 14では、decltype(auto)イディオムが導入されています。 通常、その使用は、auto宣言でdecltype指定された式のルールを使用できるようにすることです。 イディオムの "良い"使用法の例を検索すると、(Scott Meyersによる)次のようなもの、つまり関数の戻り値の型の推定についてしか考えることができません。 template<typename ContainerType, typename IndexType> // C++14 decltype(auto) grab(ContainerType&& container, IndexType&& index) { authenticateUser(); return std::forward<ContainerType>(container)[std::forward<IndexType>(index)]; } この新しい言語機能が役立つ他の例はありますか?

2
`void_t`の仕組み
私はウォルターブラウンがCppcon14で最新のテンプレートプログラミング(パートI、パートII)について語った彼のvoid_tSFINAEテクニックのプレゼンテーションを見ました。 例:すべてのテンプレート引数が正しい形式であるかどうか を評価する単純な変数テンプレートvoidがあるとします。 template< class ... > using void_t = void; そして、memberと呼ばれるメンバー変数の存在をチェックする次の特性: template< class , class = void > struct has_member : std::false_type { }; // specialized as has_member< T , void > or discarded (sfinae) template< class T > struct has_member< T , void_t< decltype( T::member ) > > …
149 c++  templates  c++14  sfinae 

7
C ++ 14の自動戻り型の控除はいつ使用する必要がありますか?
GCC 4.8.0がリリースされると、C ++ 14の一部である自動戻り型の推論をサポートするコンパイラーが提供されます。で-std=c++1y、これを行うことができます: auto foo() { //deduced to be int return 5; } 私の質問は次のとおりです。いつこの機能を使用すればよいですか?いつそれが必要で、いつコードがよりクリーンになりますか? シナリオ1 私が考えることができる最初のシナリオは、可能な限りです。このように書くことができるすべての関数はそうあるべきです。これの問題は、コードが読みやすくなるとは限らないことです。 シナリオ2 次のシナリオは、より複雑な戻り値の型を回避することです。非常に軽い例として: template<typename T, typename U> auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would return t + u; } 私はそれが本当に問題になるとは思いませんが、戻り値の型を明示的にパラメーターに依存させる方が明確な場合もあります。 シナリオ3 次に、冗長性を防ぐには: auto foo() { std::vector<std::map<std::pair<int, double>, …

2
#pragmaはC ++ 11標準の一部でしたか?
従来、C ++での複数のヘッダーのインクルードを回避する標準的で移植可能な方法は、マクロガードスキーム#ifndef - #define - #endifとも呼ばれるプリコンパイラディレクティブスキームを使用することでした(現在のコードスニペットを参照)。 #ifndef MY_HEADER_HPP #define MY_HEADER_HPP ... #endif ただし、ほとんどの実装/コンパイラ(下の図を参照)では、と呼ばれるマクロガードスキームと同じ目的で使用できる、より「エレガントな」代替手段があります#pragma once。#pragma onceマクロガードスキームと比較して、コードの削減、名前の衝突の回避、場合によってはコンパイル速度の向上など、いくつかの利点があります。 調査を行ったところ、#pragma onceほとんどすべての既知のコンパイラーでディレクティブがサポートされています#pragma onceが、ディレクティブがC ++ 11標準の一部であるかどうかがわかりません。 質問: 誰か#pragma onceがC ++ 11標準の一部であるかどうかを誰かが明確にできますか? C ++ 11標準の一部ではない場合、それを今後のリリース(C ++ 14以降など)に含める予定はありますか? また、誰かがいずれかの手法(つまり、マクロガードと#pragma once)を使用する際の利点/欠点についてさらに詳しく説明できるとよいでしょう。

1
std :: vector :: erase()およびstd :: deque :: erase()での割り当てのコピー/移動
答えるの過程では別の質問を私が少し異なる文言につまずいたstd::vector::erase()とstd::deque::erase()。 これはC ++ 14が言っていることですstd::deque::erase([deque.modifiers]/4-6私の強調): 効果: ... 複雑さ:デストラクタへの呼び出しの数は消去された要素の数と同じですが、代入演算子の呼び出しの数の数は、消去された要素の前の要素の数と後の要素の数の小さい方以下です消去された要素。 スロー:コピーコンストラクター、移動コンストラクター、割り当て演算子、または移動割り当て演算子によって例外がスローされない限り、何も発生しません。T。 そして、これがstd::vector::erase([vector.modifiers]/3-5)について言っていることです: 効果: ... 複雑さ:のデストラクタはT、消去された要素の数と等しい回数と呼ばれますが、移動代入演算子はT、消去された要素の後のベクトル内の要素の数と等しい回数と呼ばれます。 スロー:のコピーコンストラクター、移動コンストラクター、割り当て演算子、または移動割り当て演算子によって例外がスローされない限り、何も起こりませんT。 ご覧のとおり、両方の例外仕様は同じですが、std::vector代入代入演算子が呼び出されることが明示されているためです。 以下のための要件もありますTされるようにMoveAssignableするためにerase()、両方との仕事にstd::vectorとはstd::deque(表100)が、これは移動代入演算子の存在を意味するものではありません。一つはコピー代入演算子を定義し、移動代入演算子を定義することはできませんが、このクラスの意志をであるMoveAssignable。 念のため、GCCとClangで確認しました。実際にstd::vector::erase()移動代入演算子がない場合は、コピー代入演算子を呼び出しstd::deque::erase()、同じことを行います(デモ)。 だから問題は、私は何かを逃したのか、またはこれは規格の(編集上の)問題なのか? 更新:LWGの問題#2477を 送信しました。


3
ジェネリックラムダはC ++ 14でどのように機能しますか?
autoC ++ 14標準でジェネリックラムダはどのように機能しますか(引数の型としてのキーワード)? それは、C ++テンプレートに基づいていますか?異なる引数型ごとに、コンパイラーは同じ本体を使用して新しい関数を生成しますが、型を置き換えます(コンパイル時のポリモーフィズム)、それともJavaのジェネリック(型消去)に似ていますか? コード例: auto glambda = [](auto a) { return a; };
114 c++  lambda  auto  c++14 

13
C ++で「if」条件が含まれる「for」ループを回避するにはどうすればよいですか?
私が作成するほとんどすべてのコードを使用して、コレクション内の最終的な単純な "if"条件で終わるコレクションのセット削減問題に対処しています。以下に簡単な例を示します。 for(int i=0; i<myCollection.size(); i++) { if (myCollection[i] == SOMETHING) { DoStuff(); } } 関数型言語では、コレクションを別のコレクションに(簡単に)削減して問題を解決し、削減したセットですべての操作を実行できます。疑似コード: newCollection <- myCollection where <x=true map DoStuff newCollection そして、C#のような他のCバリアントでは、次のようなwhere句で減らすことができます foreach (var x in myCollection.Where(c=> c == SOMETHING)) { DoStuff(); } 以上(少なくとも私の目には) myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d)); 確かに、私は多くのパラダイムミキシングと主観/意見ベースのスタイルを行っていますが、この推奨される手法をC ++で使用できるようにするための根本的な何かが欠けていると感じざるを得ません。誰かが私を啓発できますか?
111 c++  c++11  c++14 

4
透明コンパレータとは何ですか?
C ++ 14では、連想コンテナはC ++ 11から変更されたようです– [associative.reqmts] / 13はこう言っています: メンバ関数テンプレートはfind、count、lower_bound、upper_bound、およびequal_rangeタイプがない限り、オーバーロードの解決に参加してはならないCompare::is_transparent存在します。 コンパレータを「透明」にする目的は何ですか? C ++ 14には、次のようなライブラリテンプレートも用意されています。 template <class T = void> struct less { constexpr bool operator()(const T& x, const T& y) const; typedef T first_argument_type; typedef T second_argument_type; typedef bool result_type; }; template <> struct less<void> { template <class T, class U> …
106 c++  c++14  c++-faq 

3
C ++ 14はC ++に新しいキーワードを追加していますか?
C ++標準委員会は、新しいキーワードを言語に追加することをためらう傾向がありますが、C ++ 11ではそうではありませんでした。いくつかの例: constexpr decltype thread_local auto // New usage noexcept nullptr static_assert alignof alignas C ++ 14で導入された新しいキーワードはありますか?
103 c++  c++11  keyword  c++14 

4
C ++ 14にすでに汎用ラムダがある場合に、C ++ 20に導入されたテンプレートラムダの必要性は何ですか?
c ++ 14 以下を書くことを可能にする一般的なラムダを導入しました: auto func = [](auto a, auto b){ return a + b; }; auto Foo = func(2, 5); auto Bar = func("hello", "world"); このジェネリックなラムダはfunc、テンプレート関数funcが機能するのと同じように機能することは明らかです。 C ++委員会が汎用ラムダのテンプレート構文を追加することにしたのはなぜですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.