我有一个下面的程序,我想看看在C ++ 11中使用auto时如何对容器中的最后一个元素进行条件处理,这就是为什么这个问题。
#include <iostream>
#include <set>
using namespace std;
void show(set<string>& s) {
cout << "<";
for (const auto &e: s)
if (e != s.end()) // This is WRONG -- results in compilation error !!
cout << e << ",";
else
cout << e;
cout << ">" << endl;
}
int main(int argc, char *argv[]){
set <string> s = { "a", "e", "i", "o" };
show(s);
return 0;
}
程序输出以上<a,e,i,o,>
我尝试在s.end()
的{{1}}循环中使用for
,但是编译失败。
所需的输出:
show()
答案 0 :(得分:3)
使用此:
if (&e != &*s.rbegin())
甚至更好的是,在元素前 印刷逗号。我认为它可能会更快。
if (&e != &*s.begin())
cout << "," << e;
else
cout << e;
答案 1 :(得分:2)
基于范围的for循环为了简化而牺牲了功能。在迭代器上使用auto
循环的方式比以前更简单:
for (auto it = s.begin(); it != s.end(); ++it)
{
if (std::next(it) != s.end())
cout << e << ",";
else
cout << e;
}
如果有一种便携式的方法可以使您的当前位置处于基于循环的范围内,那就太好了,但是在将其添加到标准中之前,您只需要在简单性和灵活性之间做出选择即可。 >
答案 2 :(得分:0)
我认为,最短的方法是在向输出流添加逗号之前测试'bool'变量。以下代码应符合您的需求。
#include<iostream>
#include<set>
using namespace std;
void show(set<string>& s);
int main(int argc, char *argv[]){
set <string> s = { "a", "e", "i", "o" };
show(s);
return 0;
}
void show(set<string>& s) {
cout<<'<';
bool add_comma=false;
for (const auto& e: s){
if (add_comma)cout<<',';
cout<<e;
add_comma=true;
}
cout<<'>';
}
答案 3 :(得分:0)
您通常可以通过在主循环之外打印第一个元素来获得更具可读性的代码。
//Method One, using Animate property.
$(".log-container").animate({
scrollTop: $(".log-container ul").height()
}, 800);
//Method Two, using scrollTop()
$(".log-container").scrollTop($(".log-container ul").height());