我有一个函数可以将矢量向量展平为单个向量。来自c#我会写出类似的东西:
vector<T> flatten(vector<vector<T>> 2dVector)
{
vector<T> newVector(2dVector.size()*2dVector[0].size())
for (int i = 0; i < 2dVector.size(); i++)
{
for (int j = 0; j < 2dVector[i].size(); j++)
{
newVector[j + i * 2dVector.size()] = 2dVector[i][j];
}
}
return newVector;
}
但是这段代码在msvc ++中提供了20多个错误
在网上搜索了如何制作此功能的数小时后,我将方法签名修改为
utilities.h:
template <typename A, typename B> A flatten(const B 2dVector&);
utilities.cpp:
template <typename A, typename B> A flatten(const B 2dVector&)
{
A newVector(2dVector.size()*2dVector[0].size())
for (int i = 0; i < 2dVector.size(); i++)
{
for (int j = 0; j < 2dVector[i].size(); j++)
{
newVector[j + i * 2dVector.size()] = 2dVector[i][j];
}
}
return newVector;
}
但我仍然从这段代码中得到大约15个错误的顺序,而且我完全没有想法。有什么建议吗?
答案 0 :(得分:4)
您的代码包含几个问题。仅举几例:
我建议采用以下替代方案:
#include <vector>
template<typename T>
std::vector<T> flatten(const std::vector<std::vector<T>> &orig)
{
std::vector<T> ret;
for(const auto &v: orig)
ret.insert(ret.end(), v.begin(), v.end());
return ret;
}
int main()
{
std::vector<std::vector<int>> vv;
vv.push_back(std::vector<int>{1, 2, 3});
vv.push_back(std::vector<int>{10, 20});
flatten(vv);
}