草庐IT

c++ - 通过 emplace() 将对象指针插入到 map 的 map 中不起作用

我正在尝试将指针对象插入到map通过emplace()但它不起作用。我在下面创建了一个简单的问题表示。我正在尝试插入newFooList指针对象类型Foo*.我似乎找不到为FooMap*创建类型的方法在std::mapm_fooMapList.应该用new来完成吗?在map的第二个区域?#include#include#include#include#includeclassFoo{private:intm_foobar;public:Foo(intvalue){m_foobar=value;}voidsetfoobar(intvalue);intgetfoobar();};class

c++ - 高效优雅地返回放置的 unique_ptr

我发现(thankstoaStackOverflowcomment)我的代码中存在安全漏洞:std::vector>items;templateItem&create(TS&&...mArgs){autoitem(newItem(std::forward(mArgs)...);items.emplace_back(item);//Possibleexceptionandmemoryleakreturn*item;}基本上,如果emplace_back抛出,使用原始new分配Item可能会泄漏内存。解决方案永远不会使用原始new,而是在方法主体中使用std::unique_ptr。std

c++ - 在 unordered_map 中放置 unordered_set

如何将(静态定义的)unordered_set添加到unordered_map,而不必复制unordered_set?我试过这个:std::unordered_map>my_map;for(inti=0;i还有这个:std::unordered_map>my_map;for(inti=0;i({"foo","bar"})));但它们都无法编译,我得到了这些错误(分别):error:nomatchingfunctionforcallto‘std::unordered_map>>::emplace(int&,)’和error:nomatchingfunctionforcallto‘std:

c++ - 在 C++ 中获取 Python 的 `defaultdict` 行为的最简单方法是什么?

在Python中,有一个类叫做defaultdict,它本质上是一个字典,会在构造时根据用户指定的函数来按需构造元素。C++中是否已经存在类似的类,或者我是否必须通过继承map并覆盖at方法来自己创建它? 最佳答案 这不是您问题的直接答案,但如果您希望使用与defaultdict相同的行为进行聚合,您可以使用map.emplace分配默认值如果键不存在,则返回一个指向新项或现有项的迭代器(这避免了第二次查找):unordered_mapmap={{1,1},{2,3}};//later...for(inti=1;isecond+=1

c++ - 为什么我不能在一个序列中放置多个元素?

C++11引入了emplace函数来在序列中就地构造元素。这是对复制或移动元素的insert的补充。但是,在insert的多个重载中,只有单个元素插入版本,即iteratorinsert(const_iteratorp,Tconst&x);iteratorinsert(const_iteratorp,T&&x);有一个emplace版本,templateiteratoremplace(const_iteratorp,Args&&...x);有什么理由不允许使用emplace就地构造n元素吗?当重载时,templateiteratoremplace(const_iteratorp,siz

c++ - 为什么默认构造函数不适用于 `vector::emplace_back`

#include#include#includestructPersonA{intage;std::stringname;PersonA(int_age,conststd::string&_name):age(_age),name(_name){}};structPersonB{intage;std::stringname;PersonB(int_age,conststd::string&&_name):age(_age),name(_name){}};structPersonC{intage;std::stringname;};intmain(){std::vectorpersonA

c++ - 从 std::deque 线程安全地同时调用 emplace_back() 和 operator[]() 吗?

来自emplace_back()的文档摘录:IteratorvalidityAlliteratorsrelatedtothiscontainerareinvalidated,butpointersandreferencesremainvalid,referringtothesameelementstheywerereferringtobeforethecall.DataracesThecontainerismodified.Nocontainedelementsareaccessedbythecall:concurrentlyaccessingormodifyingthemissafe

C++ 在已创建对象时设置 emplace 与 insert

classTestClass{public:TestClass(strings){}};有了TestClass,我明白了emplace和insert的区别(emplaceconstructsinplacewhileinsertcopies)settest_set;test_set.insert(TestClass("d"));test_set.emplace("d");但是,如果已经有一个TestClass对象,它们在机制和性能方面有何不同?settest_set;TestClasstc("e");test_set.insert(tc);test_set.emplace(tc);

c++ - 放置和默认构造函数

这个问题在这里已经有了答案:c++11emplace_backandpush_backsyntaxwithstruct(1个回答)Whydoesn'templace_back()useuniforminitialization?(1个回答)C++11emplace_backonvector?(8个答案)关闭4年前。给出以下代码,令我惊讶的是try_emplace无法使用主函数第一行中演示的默认构造函数,而是提示没有匹配的函数调用元素::元素(双,双)。我是否误解了编译器创建默认构造函数的方式或try_emplace的用法?我当然可以通过为Element定义一个全参数ctors来使这段代

c++ - std::vector<>::emplace_back() 中的异常安全吗?

在std::vector::emplace_back()中抛出异常时会发生什么?例如:classFoo{public:Foo(intbar){if(bar==4)throwstd::exception("Somethingwentwrong");}}和std::vector>foo_list;foo_list.emplace_back(newFoo(3));try{foo_list.emplace_back(newFoo(4));}catch(std::exceptionerror){//Howbadisit?}//Whatsinsidefoo_listnow?我希望vector只包含