使用 std::vector 初始化另一个 std::vector 的一部分

Fad*_*lly 3 c++

有没有办法在初始化列表中“扩展”一个向量变量来达到某种效果

std::vector<int> tmp1{1,1,2,3,5};
std::vector<int> tmp2{11,tmp1,99};
//tmp2 == {11,1,1,2,3,5,99}
Run Code Online (Sandbox Code Playgroud)

我知道它可以用 std::copy 或 insert 来完成。想知道是否有列表初始化方式来实现这一点。像[11,*tmp1,99]在 python 中的东西

P K*_*mer 6

使用此解决方案,您可以获得与您想要的语法接近的东西。(是的,一些工作将在运行时完成)

#include <type_traits>
#include <vector>

namespace details
{
// recursive part
template<typename type_t, typename arg_t, typename...  args_t>
void append_to_vector(std::vector<type_t>& vec, arg_t value, args_t&&... values)
{
    if constexpr (std::is_same_v<arg_t, std::vector<type_t>>)
    {
        vec.insert(vec.end(), value.begin(), value.end());
    }
    else
    {
        vec.push_back(value);
    }

    if constexpr (sizeof...(args_t) > 0)
    {
        append_to_vector(vec, std::forward<args_t>(values)...);
    }
}
}

template<typename type_t, typename...  args_t>
std::vector<type_t> make_vector(args_t&&... values)
{
    std::vector<type_t> retval;
    if constexpr (sizeof...(args_t) > 0)
    {
        details::append_to_vector(retval, std::forward<args_t>(values)...);
    }
    return retval;
};

int main()
{
    auto tmp1 = make_vector<int>(1, 1, 2, 3, 5);
    auto tmp2 = make_vector<int>(11, tmp1, 99);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)