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

时间:2013-11-19 14:44:18

标签: c++ arrays vector

我有很多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};

this question我学会了从数组创建一个向量,所以现在我有一个这样的函数:

C ++

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

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

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

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

有没有办法可以让我的函数GetVectorFromArray收到一个项目列表,我以后可以转换成一个向量? 我的编译器不支持C ++ 11

3 个答案:

答案 0 :(得分:2)

除非在声明中初始化数组,否则不能有“文字”数组。

至少在C++11 standard之前就是这种情况,它允许你想要的东西,但有一个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 };

甚至(使用uniform initialization

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

注意:不幸的是VS2012不支持这些内容,所以要么使用临时数组,要么升级到支持它的编译器(如VS2013,GCC或Clang)。


还有其他选择。其中一个是Boost任务库(Mark Tolonen为answered)。

您还可以使用旧的C风格变量参数。参见例如this old question及其accepted answer有关如何执行此操作的提示。为此,您需要提供参数列表中的元素数作为第一个函数参数,或者提供一个特殊的标记来标记列表的末尾。但是警告:由于这是直接从C继承的,因此C ++提供的额外类型安全性不存在。如果你给出一个错误类型的参数(例如doublechar),你可能会得到未定义的行为。

唯一的其他解决方案是模仿,例如Boost赋值库,但这需要大量的代码才能实现这么简单的事情。

答案 1 :(得分:1)

您可以使用第三方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;
}

答案 2 :(得分:0)

Visual Studio 2012不支持initializer list。您可以使用VS 2013获取支持(或g ++)