c++ - 使用默认构造函数在 vector 中放置

标签 c++ c++11 vector emplace

我想使用 vector::emplace 默认构造一个不可复制不可分配 对象,然后使用特定方法对象使用迭代器指向新创建的对象。请注意,该类没有参数化构造函数,只有默认构造函数。一个简单的例子是:

#include <iostream>
#include <vector>
using namespace std;

class Test {
public:
    Test() {}
private:
    Test(const Test&) = delete;             // To make clas un-copyable.
    Test& operator=(const Test&) = delete;

    int a_;
};

int main() {
    vector<Test> test_vec;
    test_vec.emplace_back();     // <---- fails

    return 0;
}

vector::emplace() 构造一个新对象但需要非默认构造函数的参数。 vector::emplace_back() 将在 vector 的末尾构造。

有没有一种方法可以放置默认构造。有没有办法像 map 那样使用分段构造或默认转发,也许使用 std::piecewise_construct ?例如,对于 map ,我们可以使用:

std::map<int,Test> obj_map;
int val = 10;
obj_map.emplace(std::piecewise_construct,
                std::forward_as_tuple(val),
                std::forward_as_tuple());

vector 有类似的东西吗?

最佳答案

vector::emplace_back() will construct at the end of the vector but also require arguments.

参数包可以为空。因此可变参数模板 emplace_back 可以在没有参数的情况下调用;即

vector<VeryLimitedClass> vec;
vec.emplace_back();

是通过其默认构造函数初始化 VeryLimitedClass 类型对象并将其“放置”在 vec 后面的有效代码。

关于c++ - 使用默认构造函数在 vector 中放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27067868/

相关文章:

c++ - 将指针的类型写入其他模板类型的成员数据

c++ - 调用基类克隆实现

c++ - Bison 移位/减少冲突无法解决

c++ - 有没有比这更简洁的方法来初始化 unique_ptr<char[]> ?

c++ - 给定索引 i,j(j>=i) 如何找到 A[j] 在子数组(i,j) 中的频率?

c++ - std::bind 与类型别名

c++ - std::cv::Mat 的 vector

c++ - 为什么我不能像这样替换字符串上的字符?

c++ - 有什么好的方法可以在 C++ 11 中初始化二维数组吗?

c++ - 使用 stringstream::imbue 和自定义全局运算符 new 调试断言失败