展平二维向量的通用方法

Ras*_*sen 2 c++ templates

我有一个函数可以将向量向量展平为单个向量。来自 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;
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码在 msvc++ 中给出了 20 多个错误

在网上搜索了几个小时以了解如何制作此功能后,我将方法签名修改为

实用程序.h:

template <typename A, typename B> A flatten(const B 2dVector&);
Run Code Online (Sandbox Code Playgroud)

实用程序.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;
}
Run Code Online (Sandbox Code Playgroud)

但是我仍然从这段代码中得到大约 15 个错误,而且我完全没有想法。有什么建议?

Ami*_*ory 5

您的代码包含几个问题。仅举几例:

  1. 标识符不能以数字开头。
  2. 您的模板应该由单个参数参数化 - 返回向量的基本值类型
  3. 您的代码在内部假定向量大小相同,因此容纳不规则数组同样容易
  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);
}   
Run Code Online (Sandbox Code Playgroud)