[英]How do I use for_each to output to cout?
有没有更直接的方法来做到这一点?
for_each(v_Numbers.begin(), v_Numbers.end(), bind1st(operator<<, cout));
如果可能,没有显式for
循环。
编辑:
如果可能,如何使用std::vector
为std::cin
执行此操作? (如何只读取n
元素)?
你可以使用std::copy
到std::ostream_iterator
来实现这个目的:
std::vector<int> v_Numbers; // suppose this is the type
// put numbers in
std::copy(v_Numbers.begin(), v_Numbers.end(),
std::ostream_iterator<int>(cout));
如果你添加一些后缀会更好:
std::copy(v_Numbers.begin(), v_Numbers.end(),
std::ostream_iterator<int>(cout, "\n"));
这假设您的容器是vector<int>
,因此您必须使用适当的类型替换该部分。
关于阅读输入的编辑 :
相反,您可以使用std::back_inserter
从一系列std::istream_iterator
复制到vector
:
std::vector<int> v_Numbers;
std::copy(std::istream_iterator<int>(cin), std::istream_iterator<int>(),
std::back_inserter(v_Numbers));
如果您只想阅读n个元素,请查看此问题 。
另一种选择 - Boost.Lambda 。
for_each(v.begin(), v.end(), cout << boost::lambda::_1);
是的,但你必须使用std :: copy算法:
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> a;
// fill a...
std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout));
}
是的,使用lambda表达式(C ++ 11)我们可以将STL容器的每个元素内联打印到cout。
#include <iostream> // cout
#include <vector> // vector
#include <algorithm> // for_each
#include <iterator> // istream_iterator
using namespace std;
int main()
{
std::vector<int> v(10,2);
std::for_each(v.begin(), v.end(), [](int i)->void {std::cout << i <<endl;});
return 0;
}
从cin到vector读取“n”值,
int main()
{
std::vector<int> v;
int elementsToRead;
cin>>elementsToRead; // Number of elements to copy
// Reading from istream
std::istream_iterator<int> ii2(std::cin);
std::copy_n(ii2, elementsToRead, std::back_inserter(v));
// printing updated vector
std::for_each(v.begin(), v.end(), [](int i)->void {cout << i <<endl;});
return 0;
}
(或)使用Lambda表达式
std::for_each(std::istream_iterator<int>(cin),std::istream_iterator<int>(),[&v](int i)->void { v.push_back(i);});
要了解有关Lambda表达式的更多信息,@ C ++ 11中的lambda表达式是什么?
并不总是适合公司代码,但为了枚举选项 - 如果你真的发现其他for_each / std :: copy等解决方案过于冗长,你可以写:
std::ostream& operator(std::ostream& os, const std::vector<My_Type>& v)
{
// pick one of the other implementations for here...
std::copy(std::istream_iterator<My_Type>(os), std::istream_iterator<My_Type>(),
std::back_inserter(v_Numbers));
}
如果你很有礼貌(;-p)足以只重载你的特定矢量实例(这需要My_Type不仅仅是一个typedef来表示int,而且创建一个模板化的类来创建新类型并不难包装任意类型)。 否则,如果其他人在您的翻译单元中的其他地方也这样做,则流式传输可能会变得模棱两可。
我知道带有迭代器的copy
是最佳解决方案,但只是为了回答for_each
。
你可以这样做:
#include <vector>
#include <algorithm>
#include <locale>
int main() {
using namespace std;
locale::global(locale(""));
wcout::imbue(locale());
vector<int> vec{1000,2000,3000,4000,5000};
for_each(vec.begin(), vec.end(), [](auto &x){wcout << x << endl;});
return 0;
}
但是,对我来说,简单for
...
#include <vector>
#include <locale>
int main() {
using namespace std;
locale::global(locale(""));
wcout::imbue(locale());
vector<int> vec{1000,2000,3000,4000,5000};
for(auto &v: vec) {
wcout << v << endl;
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.