[英]C++ same function on vectors of different types
I have a very simple function that prints a vector<double>
to cout. 我有一个非常简单的函数,可以将vector<double>
打印到cout。 I have the same function that takes vector<int>
instead. 我有使用vector<int>
的相同函数。 Can I replace these with a single function, if possible to take vectors of any type? 我可以用一个函数替换它们,如果可以的话,可以使用任何类型的向量?
void printv(vector<double> vec)
{
copy(vec.begin(),vec.end(), ostream_iterator<double>(cout," "));
cout << endl;
}
void printv(vector<int> vec)
{
copy(vec.begin(),vec.end(), ostream_iterator<int>(cout," "));
cout << endl;
}
In case someone suggests a solution specifically for printing any type of vector, I have the same issue with a function to save vectors to a file, so the point is the general problem, not specifically to do with printing. 万一有人提出了专门用于打印任何类型矢量的解决方案,我在将矢量保存到文件的功能上也遇到了同样的问题,所以重点是普遍的问题,而不是专门用于打印。
Thanks in advance! 提前致谢!
Sure. 当然。 That's what C++ is about. 这就是C ++的目的。
template<typename T>
void printv(vector<T> const& vec)
{
copy(vec.begin(), vec.end(), ostream_iterator<T>(cout," "));
cout << endl;
}
Will work as long as T
is "output-streamable". 只要T
是“可输出流”的,它将起作用。
Note: I've added const&
to the signature to avoid the copy. 注意:我在签名中添加了const&
以避免复制。
Now, you might take it a step further: 现在,您可以更进一步:
template<typename Container>
void print(Container const& c)
{
using std::begin;
using std::end;
using std::copy;
copy(begin(c), end(c), std::ostream_iterator<typename Container::value_type>(cout, " "));
cout << endl;
}
Making it work for all standard containers, not just the vector. 使它适用于所有标准容器,而不仅仅是矢量。
Yes by using templates: 是的,使用模板:
template<typename T>
void printv(std::vector<T> const &vec)
{
std::copy(vec.cbegin(),vec.cend(), ostream_iterator<T>(std::cout," "));
std::cout << std::endl;
}
Alternativelly you could define a template overloaded operator<<
for std::vector
like below: 或者,您可以为std::vector
定义模板重载的operator<<
,如下所示:
template<typename T>
std::ostream& operator<<(std::ostream &out, std::vector<T> const &v) {
std::copy(v.cbegin(), v.cend(), std::ostream_iterator<T>(out, " "));
out << std::endl;
return out;
}
int main() {
std::vector<int> iv {1, 2, 3, 4, 5};
std::vector<double> dv {1.1, 1.2, 1.3, 1.4, 1.5};
std::cout << iv << std::endl;
std::cout << dv << std::endl;
}
Try the following 尝试以下
#include <iostream>
#include <vector>
#include <cstring>
template <class T>
std::ostream & print( T &c, std::ostream &os = std::cout )
{
for ( auto x : c ) os << x << ' ';
os << std::endl;
return os;
}
template <class T, size_t N>
std::ostream & print( T ( &a )[N], std::ostream &os = std::cout )
{
for ( auto x : a ) os << x << ' ';
os << std::endl;
return os;
}
template <class T>
std::ostream & print( T *a, size_t n, std::ostream &os = std::cout )
{
for ( auto p = a; p != a + n; ++p ) os << *p << ' ';
os << std::endl;
return os;
}
int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
double b[] = { 0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9 };
char s[] = "Hello zooombini";
std::vector<int> v1( a, a + sizeof( a ) / sizeof( *a ) );
std::vector<double> v2( b, b + sizeof( b ) / sizeof( *b ) );
print( a );
print( b );
print( v1 );
print( v2 );
print( s, std::strlen( s ) );
return 0;
}
The output is 输出是
0 1 2 3 4 5 6 7 8 9
0 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9
0 1 2 3 4 5 6 7 8 9
0 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9
H e l l o z o o o m b i n i
Or even you can add one more overloaded function 甚至可以添加一个重载函数
#include <iostream>
#include <vector>
#include <cstring>
template <class T>
std::ostream & print( T &c, std::ostream &os = std::cout )
{
for ( auto x : c ) os << x << ' ';
os << std::endl;
return os;
}
template <class T, size_t N>
std::ostream & print( T ( &a )[N], std::ostream &os = std::cout )
{
for ( auto x : a ) os << x << ' ';
os << std::endl;
return os;
}
template <class T>
std::ostream & print( T *a, size_t n, std::ostream &os = std::cout )
{
for ( auto p = a; p != a + n; ++p ) os << *p << ' ';
os << std::endl;
return os;
}
std::ostream & print( const char *s, std::ostream &os = std::cout )
{
return os << s << std::endl;
}
std::ostream & print( char *s, std::ostream &os = std::cout )
{
return os << s << std::endl;
}
int main()
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
double b[] = { 0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9 };
int *p = new int[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
char s[] = "Hello zooombini";
std::vector<int> v1( a, a + sizeof( a ) / sizeof( *a ) );
std::vector<double> v2( b, b + sizeof( b ) / sizeof( *b ) );
print( a );
print( b );
print( p, 10 ) << std::endl;
print( v1 );
print( v2 );
print( s, std::strlen( s ) );
print( s );
delete []p;
return 0;
}
The output is 输出是
0 1 2 3 4 5 6 7 8 9
0 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9
H e l l o z o o o m b i n i
Hello zooombini
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.