如何使向量参数具有非特定类型?

时间:2019-06-29 22:36:50

标签: c++ function vector types

我的目标是创建一个带有向量参数的C ++函数,并且不依赖于向量的类型,将向量的内容逐个打印出来。以下代码适用于<int>类型的向量:

#include <iostream>
#include <vector>

using std::vector;

void PrintVect(vector <int> vect) {
    for (unsigned i = 0; i < vect.size(); i++) {
        std::cout << vect[i];
    }
}

int main() {

    vector <int> nums = {1, 2, 3};

    PrintVect(nums);
}

我应该进行哪些更改以使其适用于任何类型的载体?

3 个答案:

答案 0 :(得分:7)

简单:使其成为模板函数。另外,您还应通过(const)参考传递矢量,以避免不必要的复制。

const boundGetArea = circle.getArea.bind(circle);
boundGetArea();

答案 1 :(得分:2)

vector<int>和具有不同元素类型的向量,例如vector<string>,具有不同的类型,并且不共享公共的“超类型”,您可以将其传递给“打印各种矢量功能”。

但是,您可以定义一个模板函数,将矢量的元素类型作为模板参数。这样,编译器将为您实际使用的每种元素类型自动生成专用的打印功能:

template <typename T>
void PrintVect(const vector <T> &vect) {
    for (auto val : vect) {
        std::cout << val << " ";
    }
    std::cout << endl;
}

int main() {

    vector <int> nums = {1, 2, 3};
    PrintVect(nums);

    vector <string> strings = { "one", "two", "three" };
    PrintVect(strings);
}

请注意const中的&void PrintVect(const vector <T> &vect);由于向量没有被修改,因此传递向量的副本将是多余的;因此参数类型应为const引用,即const &

答案 2 :(得分:2)

您可以创建一个模板函数,该模板函数实际上将为您使用的每个vector<type>创建一个函数副本。

#include <iostream>
#include <vector>

// take the vector by reference to not copy the whole vector
// make it const to promise to not change the vector
template<typename T>
void PrintVect(const std::vector<T>& vect) {
    for(const auto& val : vect)
        std::cout << val;
}

int main() {
    std::vector<int> nums = {1, 2, 3};

    PrintVect(nums);
}

为使其更易于使用,您可以将函数转换为operator<<的重载:

#include <iostream>
#include <vector>

template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vect) {
    for(const auto& val : vect)
        os << val;
    return os;
}

int main() {
    std::vector<int> nums = {1, 2, 3};

    std::cout << nums << "\n";
}