使用Templates从参数列表创建std::vector
Creating std::vector from list of arguments using Templates
我有很多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++提供的额外类型安全性并不存在。如果你给出了一个错误类型的参数(比如double
或char
),你可能会得到未定义的行为。
唯一的其他解决方案是模拟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;
}
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?