如何将vector<vector<int>> vint
转换为vector<vector<double>>vdouble
的好方法是什么?
从C++ convert vector<int> to vector<double>我知道这可以在一维情况下完成,但我不太确定如何处理二维情况。
如何将vector<vector<int>> vint
转换为vector<vector<double>>vdouble
的好方法是什么?
从C++ convert vector<int> to vector<double>我知道这可以在一维情况下完成,但我不太确定如何处理二维情况。
emplace_back
和向量范围构造函数:
std::vector<std::vector<int>> intvec;
//intvec filled somehow
std::vector<std::vector<double>> doublevec;
doublevec.reserve(intvec.size());
for (auto&& v : intvec) doublevec.emplace_back(std::begin(v), std::end(v));
emplace_back
的好提示! - Victor Polevoystd::begin(v)
而不是 v.begin()
? - Mustafa Ozturkstd::begin
可以处理更多类型的数据,所以我在任何地方都使用它以保持一致性。 - TartanLlamaauto& v . intvec
? - Gilfoyle#include <iostream>
#include <vector>
#include <algorithm>
double castToDouble(int v) {
return static_cast<double>(v);
}
int main() {
std::vector<std::vector<int>> intv;
std::vector<std::vector<double>> doublev;
std::transform(intv.begin(), intv.end(), std::back_inserter(doublev), [](const std::vector<int> &iv) {
std::vector<double> dv;
std::transform(iv.begin(), iv.end(), std::back_inserter(dv), &castToDouble);
return dv;
});
return 0;
}
一个简单的方法是使用std::transform
和std::vector
的范围构造函数。如果你正在使用back_inserter
,你应该reserve()
一些容量以避免重复分配。
实时示例:http://coliru.stacked-crooked.com/a/84ef0e3d6572792a
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<std::vector<int>> vvi = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
std::vector<std::vector<double>> vvd;
vvd.reserve(vvi.size());
std::transform(begin(vvi), end(vvi), std::back_inserter(vvd),
[](const std::vector<int>& vi) {
return std::vector<double>(begin(vi), end(vi));
});
// Output the destination container for verification:
for_each(begin(vvd), end(vvd), [](const std::vector<double>& vd){
std::copy(begin(vd), end(vd), std::ostream_iterator<double>(std::cout, " "));
std::cout << "\n";});
}
reserve
。 - Mustafa Ozturk一个朴素的解决方案是使用两个循环,一个嵌套在另一个中,最好使用基于range的for
循环。
您还可以使用例如std::transform
与lambda表达式,该表达式反过来也会调用嵌套向量上的std::transform
,执行实际转换。
如果使用std::transform
,请记住设置目标向量的大小,或者使用例如std::back_inserter
。