オプションの要素を持つペアのC ++ 17ベクトルを初期化する方法


34

C ++ 17では、オプションの要素を使用してペア(またはタプル)のベクトルをどのように宣言および初期化しますか?

    std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true},
                                                           {2, false}, 
                                                           {3, nullptr}};

2番目の要素がnull /オプションの可能性があるペアがあります。


1
std::piecewise_construct興味深い選択肢も提供できます。
Marc Glisse


@JulienLopezそれは割り当てについて話している。
LF

@LF無関係なコンテキストを削除する場合も同じ質問です。空のオプションをどのように作成しますか?
ジュリアンロペス

1
@JulienLopez C ++では、初期化と割り当ては一般に大きく異なります。2つの質問の解が重複しているからといって、それらが同じであるとは限りません。特に、resetここでは使用したくないことに注意してください。
LF

回答:


49

std::nullopt代わりにあなたが探していnullptrます。

std::vector<std::pair<int, std::optional<bool> > > vec1 =
  { {1, true}, {2,false}, {3,std::nullopt} };

3
(ホットネットワークの質問リンクからここに来ます)C ++コードは常にstd::このようにスパムしますか?using std::vector友達だけじゃなくて、書けるのvector<pair<int, optional<bool>>?より正気に読む
アレクサンダー-モニカを

17
@ Alexander-ReinstateMonica「より正気に読む」は主観的です。読みやす引数のフリップ側は、このようなものです:私はすべてを把握するファイルの先頭に道を戻ってする必要がありますする必要はありませんこれは特に vectorpairoptionalこのラインで使用している、など私を。名前空間をインラインに含めると、その関数がどこから来て何をしているのかはっきりとわかります。ラインは自己完結型です。これは特に大きなプロジェクトに当てはまります(名前空間の競合を完全に回避するため)が、簡潔なコード例にも役立ちます。
おそらく

3
@ Alexander-ReinstateMonicaこのロジックは、記述したコードを使用するコードを完全に監視および制御できる場合は問題ありません(「衝突が発生するオフケース」がいつ発生するかが正確にわかるためです)。しかし、たとえば、他の多くの開発者が使用することを目的としたライブラリやAPIを開発しているような場合は、すべての使用法を監視して、そのような衝突が発生するかどうか、またいつ発生するかを把握することはできません。通常、その(比較的一般的な)ケースでは、衝突が発生した場合は、製品が壊れていると誰かが不平を言った後でのみ衝突を修正するよりも、衝突を先取りする方が適切です。
おそらく

3
@ Alexander-ReinstateMonica次のうちどれがすぐにトップレベルの名前であるとstd思いますか? argcountfindsize
LF

4
@ Alexander-ReinstateMonicaは、私にstd::はまったく邪魔になりません。名前空間の名前がはるかに長い場合は異なります。
Carsten S

24

または、単純なデフォルトの構築を使用します。

std::vector<std::pair<int, std::optional<bool>>> vec1 {
    {1, true}, {2,false}, {3,{}}
};

6
これは機能しますが、std::nullopt意図をよりよく伝えます。
Williham Totland
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.