家庭作业:带矢量的C ++模板

时间:2012-11-08 22:53:31

标签: c++ templates vector

我必须创建一个接收未知项类型向量的函数。 这是我的代码:

template <typename S>
void printVector(vector<S*> c){
   typename vector<S>::const_iterator A = c.begin();
   for (int A; A != c.end(); A++){
       cout<<c[A]<<" ";
   }
   cout<<endl;
}

在我的主要课程中,这是我的向量和函数调用:

vector<int> x;
int j=5;
for(int i=0;i<j;i++){
    x.push_back(num[i]);
}
printVector(x);

当我尝试编译此代码时,我收到了以下错误:

  

exercise1_1.cpp:在函数'int main()'中:
  exercise1_1.cpp:33:15:错误:没有匹配函数来调用“printVector(std::vector<int>&)”   exercise1_1.cpp:33:15:注意:候选人是:
  exercise1_1.cpp:13:7:注意:template<class S> void printVector(std::vector<S*>)

2 个答案:

答案 0 :(得分:3)

您的代码中存在一些错误。我们来看看它们:

  • printVector的签名中,您采用vector<S*>类型的参数。这意味着,对于给定类型S,您可以使用指向S的指针。因此,例如,如果类型为int,则应“发送”vector<int*>。在您的示例中,您尝试“发送”vector<int>,因此printVector的签名应如下所示:

    template <typename S>
    void printVector(vector<S> c)
    
  • 在for循环中,您再次声明变量A,为int。在C ++标准库中,您可以使用迭代器访问向量中的每个项目,或者只是像数组一样访问它们。你混合了两件事。

如果要使用迭代器循环,它应如下所示:

typename vector<S>::const_iterator a = c.begin();
for (; a != c.end(); a++){
    cout<<*a<<" ";
}

这意味着,对于向量中的每个项目,打印其值(通知我使用*a,因为我正在使用迭代器)。

或使用基于索引的方法:

for (int i = 0; i < c.size(); i++){
   cout<<c[i]<<" ";
}

此外,作为C ++社区中的常见做法,在接收非基本类型的变量时使用const引用。这可以防止执行对象的副本,因此在处理大量集合时可能会更快。例如:

 void printVector(const vector<S>& c)

所以这是一个完整的工作示例:

#include <vector>
#include <iostream>

using namespace std;

template <typename S>
void printVector(const vector<S>& c){
   for (int i = 0; i < c.size(); i++){
       cout<<c[i]<<" ";
   }
   cout<<endl;
}

int main(int argc, char** args) {
    vector<int> x;
    int j=5;
    for(int i=0;i<j;i++){
        x.push_back(i);
    }
    printVector<int>(x); // Can be printVector(x); too
    return 0;
}

答案 1 :(得分:2)

template <typename S>
void  printVector(const std::vector<S>& c){
   typename std::vector<S>::const_iterator A = c.begin();
   for (; A != c.end(); A++){
       std::cout<<*A<<" ";
   }
   std::cout<<"\n";
}

修正:

  • 您的函数被声明为vector<S*>,但您显然希望它采用vector<S>
    • 您的main函数调用了参数为std::vector<int>的print_vector。由于任何类型的int S*都不是S,因此模板不适用。
  • 当您打算仅使用第一个声明时,您已重新声明A
  • 您通过迭代器访问了对矢量的索引访问。
    • 如果你有一个int:c[i]
    • 如果您有迭代器:*it

不太重要的修复:

  • 避免using namespace std;
  • 当您的意思是std::endl
  • 时,请勿使用"\n"
  • 您应该通过const引用传递参数,而不是通过值传递