我有很多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
答案 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 ++提供的额外类型安全性不存在。如果你给出一个错误类型的参数(例如double
或char
),你可能会得到未定义的行为。
唯一的其他解决方案是模仿,例如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 ++)