c++ - 扁平化二维 vector 的通用方法

标签 c++ templates

我有一个函数可以将一个 vector 的 vector 展平为一个 vector 。来自 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 多个错误

在网上搜索如何实现此功能的几个小时后,我将方法签名修改为

实用程序.h:

template <typename A, typename B> A flatten(const B 2dVector&);

实用程序.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. 标识符不能以数字开头。
  2. 您的模板应由单个参数进行参数化 - 返回 vector 的基本值类型
  3. 您的代码在内部假定 vector 的大小相同,因此很容易容纳参差不齐的数组
  4. 有更有效的方法可以将 vector 附加到 vector 的末尾。

我建议以下替代方案:

#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);
}   

关于c++ - 扁平化二维 vector 的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38874605/

相关文章:

C++:如何使用 decltype 从迭代器获取类型

c++ - Mac 上 make 失败

css - 排版模板或良好做法

c++ - 将按位和 C++ 重载为非成员函数

C++ 链接器错误

c++ - 包含特定对象的 STL 容器模板参数

c++ - 在派生类中缺少静态成员变量时强制编译错误

c++ - 在嵌套类型中保留 volatile

c++ - 数组成员指针大小的模板推导

c++ - 为什么在构造函数的初始化列表中使用 new 运算符进行 memleak?