使用Templates从参数列表创建std::vector

Creating std::vector from list of arguments using Templates

本文关键字:std vector 创建 列表 Templates 参数 使用      更新时间:2023-10-16

我有很多C#代码必须用C++编写。我在C++方面没有太多经验。

我正在使用Visual Studio 2012进行构建。该项目是C++中的静态库(不在C++/CLI中)。

如果这个问题已经得到回答,我很抱歉,但我就是找不到。

在C#代码中,他们会初始化很多这样的数组:

C#

double[] myArray = {10, 20, 30, 40};

看看他们是如何使用数组的,当将代码复制到C++时,我决定使用std::vector来替换它们。我希望能够以同样的方式初始化向量,因为在单元测试中,他们大量使用数组初始化,但我做不到。我认为在c++的进一步版本中,vector支持它,但在我现有的版本中不支持。

更新)为了更清楚地说明我之前的声明:

这在VS2012:中不起作用

vector<double> myVector{10, 20, 30, 40};

从这个问题中,我学会了从数组中创建向量,所以现在我有了这样的函数:

C++

template<typename T, size_t N>
static std::vector<T> GetVectorFromArray( const T (&array)[N] )
{
    return std::vector<T>(array, array+N);
}

它工作得很好,但现在这意味着我必须创建数组,然后使用我的函数:

C++(我想避免这种情况,因为UnitTest有很多数组。)

double array[] = {1, 3, 5};
vector<double> myVector = ArrayUtils::GetVectorFromArray(array);

有没有一种方法可以让我的函数GetVectorFromArray接收一个项目列表,然后我可以将其转换为向量?我的编译器不支持C++11

除非在声明中初始化数组,否则不能有"literal"数组。

至少在C++11标准之前是这样的,它允许你想要的东西,但有一个std::initializer_list参数:

template<typename T>
static std::vector<T> GetVectorFromArray( std::initializer_list<T> list )
{
    return std::vector<T>(list);
}

另一方面,如果您的编译器支持C++11,您可以直接将其与std::vector一起使用:

std::vector<int> myVector = { 1, 3, 5 };

甚至(使用统一初始化)

std::vector<int> myVector{ 1, 3, 5 };

注意:不幸的是,VS2012不支持这些功能,因此您要么使用临时数组,要么升级到支持它的编译器(如VS2013、GCC或Clang)。


还有其他选择。其中之一是Boost任务库(由Mark Tolonen回答)。

您也可以使用旧的C样式变量参数。例如,请参阅这个老问题及其公认的答案,了解如何做到这一点。为此,您需要提供参数列表中的元素数量作为第一个函数参数,或者提供一个特殊的sentinel来标记列表的末尾。但有一个警告:由于这是直接从C继承的,C++提供的额外类型安全性并不存在。如果你给出了一个错误类型的参数(比如doublechar),你可能会得到未定义的行为。

唯一的其他解决方案是模拟Boost分配库,但对于这样一个简单的事情,这将需要大量的代码。

您可以使用第三方C++库Boost:来模拟这种行为

#include <boost/assign.hpp>
#include <vector>
#include <iostream>
int main()
{
    std::vector<int> v = boost::assign::list_of(1)(2)(3)(4)(5);
    for(auto i : v)
        std::cout << i << std::endl;
}

您还可以通过非成员begin/end:仅使用std库从数组初始化向量

#include <boost/assign.hpp>
#include <vector>
#include <iostream>
int main()
{
    int array[] = {1,2,3,4,5,6,7,8,9,10};
    std::vector<int> v(std::begin(array),std::end(array));
    for(auto i : v)
        std::cout << i << std::endl;
}
Visual studio 2012不支持初始值设定项列表。您可以使用VS 2013来支持(或g++)