Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在值为std::set(从某物映射到集合)的std::map中使用emplace()? 问题_C++_C++11_Stdmap_Stdset_Emplace - Fatal编程技术网

C++ 如何在值为std::set(从某物映射到集合)的std::map中使用emplace()? 问题

C++ 如何在值为std::set(从某物映射到集合)的std::map中使用emplace()? 问题,c++,c++11,stdmap,stdset,emplace,C++,C++11,Stdmap,Stdset,Emplace,我有一个名为misi的std::map。我想知道为什么misi.emplace(2345,{6,9})和misi.emplace({2345,{6,9})未按预期工作,如下所示 代码 上面是std::map的int到int,您可以看到这些方法也可以完美地工作,除了在上一个示例中,std::pair可能是冗余的。我想知道std::pair是否构建到位。(嗯,我想不是) 在这里,以下语法是可以的,但并不完全符合我的要求: // --- OK --- misi.emplace(std:

我有一个名为misi的
std::map
。我想知道为什么
misi.emplace(2345,{6,9})
misi.emplace({2345,{6,9})未按预期工作,如下所示

代码 上面是
std::map
int
int
,您可以看到这些方法也可以完美地工作,除了在上一个示例中,
std::pair
可能是冗余的。我想知道std::pair
是否构建到位。(嗯,我想不是)

在这里,以下语法是可以的,但并不完全符合我的要求:

    // --- OK ---
    misi.emplace(std::pair<int, std::set<int>>(2345, {6, 9}));
    std::cout << "misi.size(): " << misi.size() << std::endl;   // 3
    std::cout << "*misi[2345].begin(): " << *misi[2345].begin() << std::endl;   //6
    std::cout << "--------" << std::endl;

    return 0;
}

括号内的初始值设定项列表没有类型,因此无法完全转发。在这种特殊情况下,如果希望所有内容都在适当位置构造,则可以显式指定类型(
std::initializer\u list
):

misi.emplace(
  std::piecewise_construct,
  std::forward_as_tuple(2345),
  std::forward_as_tuple(std::initializer_list<int>{6, 9})
);

似乎std::set是在适当的位置创建的(对吗?)


否。同样,这会创建一个临时的
std::pair
,然后用它构造实际存储在
映射中的内容(即
pair
)。第二个结构将执行从临时存储的
集合
的移动。

非常感谢!我花了好几个小时想怎么做!现在我使用
misi.emplace(2345,std::initializer_list{6,9})编译非常完美@SiuChingPong AsukaKenji-是的,很好的一点,您实际上不需要在这里使用分段构造。
    // --- std::map to std::set initializer list constructor ---
    std::map<int, std::set<int>> misi({ {0, {42, 16}}, {1, {7}} });
    std::cout << "misi.size(): " << misi.size() << std::endl;           // 2
    std::cout << "*misi[0].begin(): " << *misi[0].begin() << std::endl; // 16
    std::cout << "*misi[1].begin(): " << *misi[1].begin() << std::endl; // 7
    // --- Compilation Errors ---
    //misi.emplace(2345, 6, 9);
    //misi.emplace({2345, 6, 9});
    //misi.emplace(2345, {6, 9});
    //misi.emplace({2345, {6, 9}});
    //misi.emplace(
    //  std::piecewise_construct,
    //  std::forward_as_tuple(2345),
    //  std::forward_as_tuple(6, 9)
    //);
    //misi.emplace(
    //  std::piecewise_construct,
    //  std::forward_as_tuple(2345),
    //  std::forward_as_tuple({6, 9})
    //);
    // --- OK ---
    misi.emplace(std::pair<int, std::set<int>>(2345, {6, 9}));
    std::cout << "misi.size(): " << misi.size() << std::endl;   // 3
    std::cout << "*misi[2345].begin(): " << *misi[2345].begin() << std::endl;   //6
    std::cout << "--------" << std::endl;

    return 0;
}
$ clang++ --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
misi.emplace(
  std::piecewise_construct,
  std::forward_as_tuple(2345),
  std::forward_as_tuple(std::initializer_list<int>{6, 9})
);
misi.emplace(
  2345,
  std::initializer_list<int>{6, 9}
);
mii.emplace(std::pair<int, int>(2345, 6));
misi.emplace(std::pair<int, std::set<int>>(2345, {6, 9}));