【问题标题】:Template function to read n-dimensional vector [duplicate]读取n维向量的模板函数[重复]
【发布时间】:2023-01-23 21:14:10
【问题描述】:

我正在学习模板编程。在这样做的同时,我正在尝试实现一个模板函数来读取 n 维向量。

我的思维过程是递归地读取所有维度,一旦我到达最里面的向量,就开始读取它的元素。 以下是我尝试过的(不正确的)代码。

template<typename Container>
void read_vectors(Container c){
    read_vectors<decltype(begin(c))>(begin(c));
}

template<>
void read_vectors(vector<int> container){
    for(auto i:container)
        cout<<i<<endl;
}

int main(){
    vector<vector<vector<int>>> intvectors{{{1,2,3},{1,2,3}},{{1,2,3}, {1,2,3}}};
    read_vectors(intvectors);
    return 0;
}

关于如何实现这一目标的任何指示都是有帮助的。

【问题讨论】:

  • begin(c) 是迭代器,而不是向量元素。
  • 那不是读书,是写作。
  • 发布的代码有什么问题?我的意思是除了缺少包括?为什么要从代码中删除包含?任何对看到编译器错误感兴趣的人都必须将它们添加回去

标签: c++ templates


【解决方案1】:

首先,按值传递函数参数会创建函数参数的副本:

template<>
void read_vectors(vector<int> container){

当达到这一点时,将制作传入向量的完整副本,仅用于传入此参数。除了浪费内存和宝贵的电子之外,这绝对没有任何作用。在这种情况下,参数应该通过引用传递。

其次,对于所有其他维度,也有必要迭代所有其他维度。没有什么会自动迭代它们。所以最终的解决方案是:

#include <vector>
#include <iostream>

using namespace std;

template<typename Container>
void read_vectors(const Container &c)
{
    for (const auto &i:c)
    {
        read_vectors(i);
    }
}

template<>
void read_vectors(const vector<int> &container){
    for(auto i:container)
        cout<<i<<endl;
}

int main(){
    vector<vector<vector<int>>> intvectors{{{1,2,3},{1,2,3}},{{1,2,3}, {1,2,3}}};
    read_vectors(intvectors);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多