我写了这个程序,它从最大到最小对向量中的数字进行排序,虽然效果很好,但是困扰我的唯一一件事就是试图从最后一个数字中删除逗号。这是我的代码
#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main() {
vector<int> vi1, vi2, vi3;
srand(987);
for (int i = 0; i < 10; ++i) vi1.push_back(rand() % 10);
sort(vi1.begin(), vi1.end());
for (int i = 0; i < 10; ++i) vi2.push_back(rand() % 10);
sort(vi2.begin(), vi2.end())
while(!vi1.empty() && !vi2.empty()) {
if(vi1.back()>=vi2.back()) {
vi3.push_back(vi1.back());
vi1.pop_back();
}
else {
vi3.push_back(vi2.back());
vi2.pop_back();
}
}
while(!vi1.empty()) {
vi3.push_back(vi1.back());
vi1.pop_back();
}
while(!vi2.empty()) {
vi3.push_back(vi2.back());
vi2.pop_back();
}
for (auto i = vi3.begin(); i != vi3.end(); ++i)
cout << *i << ", ";
cout << "\nBye..." << endl;
return 0;
}
这是输出
9, 9, 9, 8, 8, 8, 6, 6, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0,
Bye...
如您所见,最后一个0后有一个逗号,语法上没有意义。如何删除该逗号?
答案 0 :(得分:6)
除了删除之外,最简单的方法是仅打印除第一个值以外的其他值的逗号:
for (auto i = vi3.begin(); i != vi3.end(); ++i) {
if(i != vi3.begin()) {
cout << ", ";
}
cout << *i;
}
我经常使用这个习惯用法来格式化例如SQL参数列表,或类似的参数,在最后一个元素之后不希望使用定界符,但对于其他任何元素都不需要定界符。
还有其他方法可以检测 first元素(例如,在循环开始之前使用初始化为bool
的{{1}}变量,并在第一次迭代时将其设置为true
)。
对于您的示例,似乎只检查false
是最简单,最自然的方法。
这是伪代码中的通用变体:
vi3.begin()
答案 1 :(得分:0)
如果begin
,end
至少是双向迭代器(与您一样),
您可以最初检查begin
!= end
;如果不打印什么;如果这样打印
", "
个穿孔元素使begin != std::prev(end)
递增,并且
最后打印*begin()
。像这样:
main.cpp
#include <utility>
template<typename OStream, typename BiIter, typename Punct>
void punctuated(OStream && out, Punct && punct, BiIter begin, BiIter end)
{
if (begin != end) {
for (--end ;begin != end; ++begin) {
std::forward<OStream>(out) << *begin << std::forward<Punct>(punct);
}
std::forward<OStream>(out) << *begin;
}
}
#include <iostream>
#include <vector>
#include <list>
#include <set>
int main()
{
std::vector<int> v0;
std::vector<int> v1g++ -Wall -Wextra main.cpp && ./a.out
v0 []
v1 [1]
l [1,2]
s [3|4|5|6|7]
;
std::list<int> l{{1,2}};
std::set<int>s{{3,4,5,6,7}};
std::cout << "v0 [";
punctuated(std::cout,",",v0.begin(),v0.end());
std::cout << "]\n";
std::cout << "v1 [";
punctuated(std::cout,",",v1.begin(),v1.end());
std::cout << "]\n";
std::cout << "l [";
punctuated(std::cout,",",l.begin(),l.end());
std::cout << "]\n";
std::cout << "s [";
punctuated(std::cout,"|",s.begin(),s.end());
std::cout << "]\n";
return 0;
}
输出:
For Each element As String In File.ReadAllLines("test.txt")
console.writeline(element)
next