我的目标是创建一个带有向量参数的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);
}
我应该进行哪些更改以使其适用于任何类型的载体?
答案 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";
}