use*_*ser 11 c++ iterator ostream c++11
在您看来,在C++ 11中打印std::cout使用std::ostream_iterator并避免打印尾随分隔符时,最优雅的方法是什么?
我正在打印的对象具有双向迭代器,但不是随机访问迭代器.
std::list<double> x{1,2,3,4,5,6};
std::copy(x.begin(), std::prev(x.end()),
std::ostream_iterator<int>(std::cout, ",") );
if ( x.size() != 0 )
std::cout << *(--x.end()) << std::endl;
Run Code Online (Sandbox Code Playgroud)
How*_*ant 10
这是我的最爱之一,但它没有使用std::ostream_iterator:
#include <iterator>
#include <string>
#include <iosfwd>
template <class C>
auto
print(std::ostream& os, const C& c,
const std::string& delim = std::string(", "),
const std::string& open_brace = std::string("{"),
const std::string& close_brace = std::string("}")
) -> decltype(std::begin(c), std::end(c), os)
{
os << open_brace;
auto i = std::begin(c);
auto e = std::end(c);
if (i != e)
{
os << *i;
for (++i; i != e; ++i)
os << delim << *i;
}
os << close_brace;
return os;
}
#include <list>
#include <iostream>
int main()
{
std::list<double> x{1,2,3,4,5,6};
print(std::cout, x) << '\n';
}
{1, 2, 3, 4, 5, 6}
Run Code Online (Sandbox Code Playgroud)
更新
奥利弗怂恿我无法抗拒的挑战.:-)
#include <iterator>
#include <string>
#include <iosfwd>
namespace my {
template <class C>
auto
print(std::ostream& os, const C& c,
const std::string& delim = std::string(", "),
const std::string& open_brace = std::string("{"),
const std::string& close_brace = std::string("}")
) -> decltype(std::begin(c), std::end(c), os);
template <class C,
typename std::enable_if
<
!std::is_same<C, std::string>::value,
bool>::type = false
>
inline
auto
operator<< (std::ostream& os, const C& c) -> decltype(print(os, c))
{
return print(os, c);
}
template <class C>
auto
print(std::ostream& os, const C& c,
const std::string& delim,
const std::string& open_brace,
const std::string& close_brace
) -> decltype(std::begin(c), std::end(c), os)
{
os << open_brace;
auto i = std::begin(c);
auto e = std::end(c);
if (i != e)
{
os << *i;
for (++i; i != e; ++i)
os << delim << *i;
}
os << close_brace;
return os;
}
}
#include <list>
#include <forward_list>
#include <iostream>
int main()
{
std::forward_list<std::list<double>> x{{}, {3, 2, 1}, {1,2,3,4,5,6}};
my::print(std::cout, x) << '\n';
}
{{}, {3, 2, 1}, {1, 2, 3, 4, 5, 6}}
Run Code Online (Sandbox Code Playgroud)
它并不完美,但很有趣.:-)可能有更好的方法来传播自定义分隔符和更忠实的括号.
| 归档时间: |
|
| 查看次数: |
1356 次 |
| 最近记录: |