4

最近、C++11 に慣れてきましたが、autoキーワードは素晴らしいです。タイピング:

for (auto bar : bars) {

とても満足です。コードを読みやすくきれいに保ちます。それがあなたの勢いをすべて止めているようにまだ感じているのは、次のとおりです。

foo.insert(std::pair<std::string, bar>("soVerbose", baz));

// As opposed to simply:

foo.insert("soVerbose", baz);

それがそのようになっている正当な理由はありますか?そして、それを冗長にするためのきちんとした方法はありますか? []要素をマップに挿入するために演算子を使用できることは知っていますが、機能は少し異なります。

4

4 に答える 4

15

emplace関数を使用します。

#include <iostream>
#include <utility>

#include <map>

int main()
{
    std::map<std::string, std::string> m;

    // uses pair's copy-constructor
    m.emplace(std::make_pair(std::string("a"), std::string("a")));

    // uses pair's converting copy constructor
    m.emplace(std::make_pair("b", "abcd"));

    // uses pair's template constructor
    m.emplace("d", "ddd");

    // uses pair's piecewise constructor
    m.emplace(std::piecewise_construct,
              std::forward_as_tuple("c"),
              std::forward_as_tuple(10, 'c'));

    for (const auto &p : m) {
        std::cout << p.first << " => " << p.second << '\n';
    }
}
于 2013-12-11T22:49:51.477 に答える
11

どちらを使用std::make_pair()すると、少なくとも少し良くなります。

foo.insert(std::make_pair("soVerbose", baz));

実際、これが機能することを意図しているかどうかは完全にはわかりませんが、そうであると思います (よくわからない理由は、それが次の"soVerbose"ように推測できchar const[10]、型char const[10]がコピー可能ではないためです。少なくとも、それはエラーでした。ある時点でのいくつかの実装で)。私はまだC++ 11を十分に使用していませんが、使用できると思います

foo.insert({ "notSoVerbose", baz });

(コードは確かにgccclangでコンパイルされます)。

他の人がすでにそれについて言及しているのを見ますが、実際には、あなたは本当に使うでしょう:

foo.emplace("pretty cool", baz);
于 2013-12-11T22:47:05.890 に答える
5

make_pair を使用できます。これにより、ペアの要素の型を詳細に記述しなくても推測できます。

foo.insert(std::make_pair("soVerbose", baz));

ただし、C++11 (最近のビジュアル スタジオなど) を使用している場合は、emplace を使用することをお勧めします。

foo.emplace("soVerbose", baz);
于 2013-12-11T22:45:58.403 に答える
0

冗長書き込みを減らすには

foo.emplace("soVerbose", baz);
于 2013-12-12T12:04:51.597 に答える