用于展平2d向量的通用方法

时间:2016-08-10 13:17:12

标签: 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;
}

但是这段代码在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个错误的顺序,而且我完全没有想法。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

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

  1. 标识符不能以数字开头。
  2. 您的模板应该由单个参数参数化 - 返回的矢量的基本值类型
  3. 你的代码在内部假设向量大小相同,容纳一个粗糙的数组就容易了
  4. 有一种更有效的方法可以将矢量附加到矢量的末尾。
  5. 我建议采用以下替代方案:

    #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);
    }   
    
相关问题