- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
考虑以下程序:
#include <string>
#include <vector>
using namespace std;
struct T
{
int a;
double b;
string c;
};
vector<T> V;
int main()
{
V.emplace_back(42, 3.14, "foo");
}
它不起作用:
$ g++ -std=gnu++11 ./test.cpp
In file included from /usr/include/c++/4.7/x86_64-linux-gnu/bits/c++allocator.h:34:0,
from /usr/include/c++/4.7/bits/allocator.h:48,
from /usr/include/c++/4.7/string:43,
from ./test.cpp:1:
/usr/include/c++/4.7/ext/new_allocator.h: In instantiation of ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = T; _Args = {int, double, const char (&)[4]}; _Tp = T]’:
/usr/include/c++/4.7/bits/alloc_traits.h:253:4: required from ‘static typename std::enable_if<std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::value, void>::type std::allocator_traits<_Alloc>::_S_construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = T; _Args = {int, double, const char (&)[4]}; _Alloc = std::allocator<T>; typename std::enable_if<std::allocator_traits<_Alloc>::__construct_helper<_Tp, _Args>::value, void>::type = void]’
/usr/include/c++/4.7/bits/alloc_traits.h:390:4: required from ‘static void std::allocator_traits<_Alloc>::construct(_Alloc&, _Tp*, _Args&& ...) [with _Tp = T; _Args = {int, double, const char (&)[4]}; _Alloc = std::allocator<T>]’
/usr/include/c++/4.7/bits/vector.tcc:97:6: required from ‘void std::vector<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {int, double, const char (&)[4]}; _Tp = T; _Alloc = std::allocator<T>]’
./test.cpp:17:32: required from here
/usr/include/c++/4.7/ext/new_allocator.h:110:4: error: no matching function for call to ‘T::T(int, double, const char [4])’
/usr/include/c++/4.7/ext/new_allocator.h:110:4: note: candidates are:
./test.cpp:6:8: note: T::T()
./test.cpp:6:8: note: candidate expects 0 arguments, 3 provided
./test.cpp:6:8: note: T::T(const T&)
./test.cpp:6:8: note: candidate expects 1 argument, 3 provided
./test.cpp:6:8: note: T::T(T&&)
./test.cpp:6:8: note: candidate expects 1 argument, 3 provided
这样做的正确方法是什么?为什么?
(也试过单双大括号)
最佳答案
您需要为该类显式定义一个 ctor:
#include <string>
#include <vector>
using namespace std;
struct T
{
int a;
double b;
string c;
T(int a, double b, string &&c)
: a(a)
, b(b)
, c(std::move(c))
{}
};
vector<T> V;
int main()
{
V.emplace_back(42, 3.14, "foo");
}
使用 emplace_back
的目的是避免创建一个临时对象,然后将其复制(或移动)到目的地。虽然也可以创建一个临时对象,然后将其传递给 emplace_back
,但它(至少大部分)没有达到目的。您要做的是传递单个参数,然后让 emplace_back
使用这些参数调用 ctor 以就地创建对象。
关于C++11 emplace_back on vector<struct>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13812703/
我正在尝试创建执行搜索的线程 vector 。这是我的 SearchThread 类中的重要内容。 class SearchThread { explicit SearchThread
给定以下代码 测试.h: #ifndef __graph_aufbau_header__ #define __graph_aufbau_header__ #include #include #in
关于 someFunctionOne 和 someFunctionTwo。 当每个都放置到 map 中时,最终结果是否仍然相同? 指针是否升级为智能指针? struct MyStruct {
我对 emplace_back 的行为有点困惑。一起来看看吧。 struct innerObject { innerObject(int ); }; class outterObject {
我尝试将类 cBar 的两个实例放置到具有 emplace_back 函数的 vector 中。 根据reference调用 emplace_back 仅保留 vector 中的位置,然后“就地”创建
我想知道是否可以使用 emplace_back 将项目存储到 vector 中,emplace_back 是一种派生自 vector 所期望的类的类型。 例如: struct fruit {
这是我日常工作中的一段代码。我只想问你这两种情况有什么区别,尤其是在性能方面。 std::vector > aVec; // case 1 aVec.emplace_back("hello", "bo
我向你展示我的问题 我有 2 个列表,将它们命名为 A 和 B。 list > A = {{1},{2},{3}}; list > B = {{4},{5},{6}}; 我想要的是 A = {{1,4
#include #include using namespace std; class test{ public: test(){
似乎添加默认构造函数会阻止调用 emplace_back 并产生错误消息:“静态断言失败:类型不可分配”(gcc 5.3 with -std=c++14)。这是一个说明问题的简单代码: class A
我编写了一个简单的程序来尝试在标准库容器中就地创建对象。这是我写的: #include #include class AB { public: explicit AB(int n);
我想知道我是否正确理解emplace_back #include using namespace std; struct Hero { Hero(const string&) {}
这个问题在这里已经有了答案: Emplace an aggregate in std::vector (3 个答案) 关闭 4 年前。 为什么我可以直接调用构造函数,但是当我在 emplace_ba
我正在尝试为我的用户定义结构使用 emplace_back: #include #include #include struct IDNumber { IDNumber(std::vec
考虑下面的例子: #include #include class S { public: S() { puts("S()"); } S(int) { puts("S(int)"); }
我正在创建一个指向新对象的新指针,并立即将 push_front 放入双端队列。我想改为使用 emplace_front,但遇到编译器错误。 我的对象构造函数需要 1 个字符串参数。 std::deq
所以我一直在制作一个对象池类,它是这样使用的: class MagicTrick { public: MagicTrick(int magic) : _magic(magic) {}
#include #include struct T{ T(){ std::cout vec; vec.push_back(T()); vec.push_
我在实现我自己的模板类时遇到了困难,我想在其中添加我自己的 emplace_back 函数实现。由于我仍在学习模板设计,非常感谢您在这里提供意见。 template class MydataStru
这个问题在这里已经有了答案: emplace_back() does not behave as expected (2 个答案) 关闭 8 年前。 我很好奇这段代码的输出结果。 #include
我是一名优秀的程序员,十分优秀!