2014-09-26 34 views
1

我有一个非常简单的功能,将vector<double>打印到cout。我有相同的功能,取而代之的是vector<int>。我可以用一个函数替换这些函数吗,如果可能的话,可以使用任何类型的向量?C++在不同类型的向量上具有相同的功能

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; 
} 

,以防有人提出一个解决方案,专门用于打印任何类型的载体,我有同样的问题用一个函数来向量保存到一个文件中,这样的点是普遍的问题,而不是专门做与印刷。

在此先感谢!

回答

6

肯定。这就是C++的意义所在。

template<typename T> 
void printv(vector<T> const& vec) 
{ 
    copy(vec.begin(), vec.end(), ostream_iterator<T>(cout," ")); 
    cout << endl; 
} 

只要T是“output-streamable”就会工作。

注意:我已将const&添加到签名以避免复制。现在


,你可以把它更进了一步:

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; 
} 

使其成为所有标准集装箱,而不仅仅是向量工作。

+0

副本可能无论如何都会被删除 – 4pie0 2014-09-26 11:21:10

+4

@ 0d0a为什么依靠可能?在很多情况下它不会。 (事实上​​,我不能认为任何情况下,它不会复制) – 2014-09-26 11:21:38

+0

不依赖于可能,只是知道它可能会被删除,这只是信息 – 4pie0 2014-09-26 11:22:29

2

是通过使用模板:

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你可以定义模板重载operator<<std::vector象下面这样:

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; 
} 

LIVE DEMO

-2

请尝试以下

#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; 
} 

输出是

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 

甚至可以添加更多的重载函数

#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; 
} 

输出是

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 
+0

你可以使用'begin/end'而不是'a + sizeof(a)/ sizeof(* a)',这看起来非常糟糕。 – 2014-09-26 11:30:01

+0

@Bartek Banachewicz对于这样一个简单的代码,没有必要包含头文件。 – 2014-09-26 11:30:46

+0

因此,你宁愿使用一个晦涩的hacky解决方案,而不是包含标准库头文件? *来吧。* – 2014-09-26 11:32:11

相关问题