将整数列表打印为逗号分隔的数字列表,每行最多 10 个
Printing a list of integers as comma separated list of numbers with max 10 per line
我有一个号码列表。我想将它们打印为逗号分隔的数字列表,每行最多 10 个数字。下面的程序片段放在逗号分隔的数字列表中,没有使用显式 for 循环来迭代整数向量,我可以每行最多打印 10 个数字吗?
std::vector<int> myvector;
for (int i=1; i<10; ++i) myvector.push_back(i*10);
stringstream ss;
std::copy(myvector.begin(), myvector.end(),
std::ostream_iterator<int>(ss, ", "));
cout << "list: " << ss.str() << endl;
输出显示为(末尾有额外的逗号):
list: 10, 20, 30, 40, 50, 60, 70, 80, 90,
我找到了解决我原来问题的方法:
// print at most 6 per line
int maxperline = 6;
std::vector<int>::const_iterator i1,i2,i3;
stringstream ss;
ss << "list: ";
for (i1 = myvector.begin(), i2 = myvector.end(); i1 < i2; i1+=maxperline) {
i3 = min(i2, i1+maxperline);
std::copy(i1, i3-1, std::ostream_iterator<int>(ss, ", "));
ss << *(i3-1) << '\n';
}
cout << '\n' << ss.str() << endl;
输出显示为:
list: 10, 20, 30, 40, 50, 60
70, 80, 90
在这种方法中,我们可以通过将 maxperline 设置为您想要的值来获得灵活性
有一些 count
的输出项目,并使用它。
int count = 0;
for (int i : myvector) {
if (count > 0) std::cout << ", ";
std::cout << i;
if (count % 10 == 0 && count >0) std::cout << std::endl;
count++;
}
如果你真的想要使用<algorithm>
你可以有一个匿名的lambda
int count;
std::for_each(myvector.begin(), myvector.end(),
[&](int i) {
if (count > 0)
std::cout << ", ";
std::cout << i;
if (count % 10 == 0 && count >0)
std::cout << std::endl;
count++;
});
(我们显然需要 count
和 std::cout
被捕获并关闭 by reference 在闭包中,因此 [&]
...)
但老实说,在那种特殊情况下,像上面那样使用 std::for_each
进行编码会显得迂腐。像我的第一个例子那样使用普通的 for
循环更短也更合适。
顺便说一句,好的优化编译器(可能包括最近的 GCC 作为 g++ -Wall -O2 -std=c++11
调用)可能会将第二个解决方案(使用 std::for_each
)优化为与第一个(使用 for
,并且 没有 分配闭包)。
您甚至可以尝试用纯 continuation-passing style 编码该片段(在 count==0
和 count%10==0
以及其他情况下使用不同的延续)但是那会很糟糕,不可读和编译效率较低...
我有一个号码列表。我想将它们打印为逗号分隔的数字列表,每行最多 10 个数字。下面的程序片段放在逗号分隔的数字列表中,没有使用显式 for 循环来迭代整数向量,我可以每行最多打印 10 个数字吗?
std::vector<int> myvector;
for (int i=1; i<10; ++i) myvector.push_back(i*10);
stringstream ss;
std::copy(myvector.begin(), myvector.end(),
std::ostream_iterator<int>(ss, ", "));
cout << "list: " << ss.str() << endl;
输出显示为(末尾有额外的逗号):
list: 10, 20, 30, 40, 50, 60, 70, 80, 90,
我找到了解决我原来问题的方法:
// print at most 6 per line
int maxperline = 6;
std::vector<int>::const_iterator i1,i2,i3;
stringstream ss;
ss << "list: ";
for (i1 = myvector.begin(), i2 = myvector.end(); i1 < i2; i1+=maxperline) {
i3 = min(i2, i1+maxperline);
std::copy(i1, i3-1, std::ostream_iterator<int>(ss, ", "));
ss << *(i3-1) << '\n';
}
cout << '\n' << ss.str() << endl;
输出显示为:
list: 10, 20, 30, 40, 50, 60
70, 80, 90
在这种方法中,我们可以通过将 maxperline 设置为您想要的值来获得灵活性
有一些 count
的输出项目,并使用它。
int count = 0;
for (int i : myvector) {
if (count > 0) std::cout << ", ";
std::cout << i;
if (count % 10 == 0 && count >0) std::cout << std::endl;
count++;
}
如果你真的想要使用<algorithm>
你可以有一个匿名的lambda
int count;
std::for_each(myvector.begin(), myvector.end(),
[&](int i) {
if (count > 0)
std::cout << ", ";
std::cout << i;
if (count % 10 == 0 && count >0)
std::cout << std::endl;
count++;
});
(我们显然需要 count
和 std::cout
被捕获并关闭 by reference 在闭包中,因此 [&]
...)
但老实说,在那种特殊情况下,像上面那样使用 std::for_each
进行编码会显得迂腐。像我的第一个例子那样使用普通的 for
循环更短也更合适。
顺便说一句,好的优化编译器(可能包括最近的 GCC 作为 g++ -Wall -O2 -std=c++11
调用)可能会将第二个解决方案(使用 std::for_each
)优化为与第一个(使用 for
,并且 没有 分配闭包)。
您甚至可以尝试用纯 continuation-passing style 编码该片段(在 count==0
和 count%10==0
以及其他情况下使用不同的延续)但是那会很糟糕,不可读和编译效率较低...