使用另一个元素和额外元素的内容初始化C ++(11)std :: vector

费伦茨·迪克(Ferenc Deak)

我需要一种在声明阶段初始化向量的“优雅”方式,其中要包含另一个和几个额外元素的内容。

我要解决的是:

让我们考虑以下带有初始化的(示例)声明:

const std::vector<std::string> c90_types = {
    "char",
    "signed char",
    "unsigned char",
    "short",
    "unsigned short",
    "int",
    "unsigned int",
    "long",
    "unsigned long",
    "float",
    "double",
    "long double"
};

const std::vector<std::string> c99_types = {
    "char",
    "signed char",
    "unsigned char",
    "short",
    "unsigned short",
    "int",
    "unsigned int",
    "long",
    "unsigned long",
    "float",
    "double",
    "long double",
    "long long",
    "unsigned long long",
    "intmax_t",
    "uintmax_t"
};

如您所见,c99_types有一个子集正好是c90_types我想避免需要更改子集然后手动更改“超集”的情况,只是为了避免可能引入错误的额外步骤:)

附带说明一下,我不想编写如下代码:

second.insert(second.begin(), first.begin(), first.end());
second.push_back(something);

有什么好的和干净的解决方案吗?

洛朗·拉里扎(Laurent LA RIZZA)

有一个技巧叫“我想用一些复杂的东西初始化一个const变量”。C ++ 11成为了可能,这是从Javascript偷来的。

const std::vector<std::string> c90_types = {
    "char",
    // and so on, and so forth....
};

const std::vector<std::string> c99_types = ([&](){
    const auto additional_types = { // initializer_list<const char *>, but it does not matter.
        "long long",
        "unsigned long long",
        "intmax_t",
        "uintmax_t"
    };

    std::vector<std::string> vec{c90_types};

    vec.insert(vec.end(), additional_types.begin(), additional_types.end());

    return vec;
})();

将您的初始化逻辑打包到一个未命名的lambda中,然后立即调用它,将const变量复制初始化。

vec 已移动,未复制。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在c ++ 11中初始化std :: vector <std :: string>的静态constexpr成员?

使用新的C ++ 11 std :: async加速std:.vector填充

如何在C ++ 11中初始化std :: vector的值列表?

删除与另一个给定std :: string中的字符匹配的std :: vector <std :: string>中的元素

初始化std :: tuple哪些元素构造函数需要另一个std :: tuple的对象

从计数和带有副本的元素值初始化std :: vector?

std :: vector分配值SIGNAL 11和SIGNAL 6

启用C ++ 11时std :: vector性能回归

C++:为 std::vector 分配内存,然后并行初始化其元素

如何使用构造函数初始值设定项列表中的n个元素初始化std :: vector <std :: time_t>

为什么 std::vector::insert 是一个空初始化列表的无操作?

初始化std :: string的std :: vector

在一个结构内的c ++:std :: vector的std :: vector

从std :: vector的每个元素中减去一个值

C ++ 11中访问std :: vector中元素n的指针的标准方法是什么?

使用std :: vector进行std :: array初始化

使用std :: vector的std :: map初始化

std::vector 的 std:array 的 SFINAE 不能在 C++11 中编译

如何默认初始化std :: vector

std :: vector初始化的模板参数

std :: vector类成员的初始化

在结构中初始化std :: vector

高效的std :: vector的直接初始化

如何使用包含std :: thread的std :: vector的结构类型正确初始化std :: vector

用硬编码元素初始化std :: vector的最简单方法是什么?

我可以通过元素的完美转发来列表初始化std :: vector吗?

重复std :: vector的内容

如何从C样式数组初始化std :: vector?

C++ - 构造函数中的 std::vector 初始化