有没有更直接的方法来做这件事?
for_each(v_Numbers.begin(), v_Numbers.end(), bind1st(operator<<, cout));
如果可能的话,不使用显式的for
循环。
编辑:
如果可能,如何在具有std::vector
的std::cin
中执行此操作?(仅读取n
个元素)?
有没有更直接的方法来做这件事?
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>(std::cout));
如果你添加一些后缀的话,会更好:
std::copy(v_Numbers.begin(), v_Numbers.end(),
std::ostream_iterator<int>(std::cout, "\n"));
假设你的容器是一个vector<int>
,因此你需要将那部分替换为相应的类型。
编辑关于读取输入:
相反地,你可以使用std::back_inserter
将一系列std::istream_iterator
中的内容复制到vector
中:
std::vector<int> v_Numbers;
std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
std::back_inserter(v_Numbers));
如果您只想读取 n 个元素,请查看此问题。
ostream_iterator
是一个模板,你需要std::ostream_iterator<v_Numbers::value_type>(cout)
。 - GManNickG错误:v_Numbers不能出现在常量表达式中
。 - nakiyav_Numbers
替换为v_Numbers
的类型(例如std::vector<int>::value_type
)。 - Björn Pollexstd::copy
。for_each
需要一个接受 v_Numbers::value_type
的 operator()
。 - MSalters是的,但您必须使用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;
}
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表达式?
std::endl
。 - Marine Galantin在企业代码中并不总是合适的,但为了列举选项,如果你真的觉得其他 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),并且只重载特定实例化的 vector(这需要 My_Type 不仅是 typedef,也不难创建一个模板类来创建包装任意类型的新类型),那么它会好得多。否则,如果其他人在您的翻译单元中的其他地方做同样的事情,流处理可能会变得模糊。
我知道使用迭代器的 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;
}