如何以更时尚/更短的方式做到以下几点?
for(i=container.begin(); i!=container.end(); ++i) {
if (i!=container.begin()) {
cout << ", ";
}
cout << *i;
j=i;
if (++j==container.end()) {
cout << "!" << endl;
}
}
foreach之类的解决方案是可以接受的(首先是最后元素上的操作,但是)。
P.S。 有许多答案正在处理第一个元素,但不是最后一个。这就是处理最后一个元素的意思:
for(i=container.begin(); i!=container.end(); ++i) {
j=i;
if (i==container.begin()) {
cout << "[" << *i << "]" << endl;
} else if (++j==container.end()) {
cout << ", (" << *i << ")" << "!" << endl;
} else {
cout << ", " << *i;
}
}
难道您不认为在循环体外处理第一个元素非常容易吗?真正的问题是最后一个问题!我很抱歉无法澄清提出这个问题的重点。我想我最终会接受排名靠前的答案。
答案 0 :(得分:3)
我的建议是:在此循环中检测任何内容都没有意义!
由于您的特殊情况位于容器的开头和结尾,因此很容易从循环中删除它们的处理。
以下函数将打印任何容器类的内容,其元素可以<<
添加到std::ostream
:
template < class Container >
void print(Container const & container)
{
typename Container::const_iterator current = container.begin();
typename Container::const_iterator const end = container.end();
if (current != end)
{
std::cout << *current;
for (++current; current != end; ++current)
{
std::cout << ", " << *current;
}
std::cout << "!" << std::endl;
}
}
答案 1 :(得分:3)
Boost有next / prior,在这种情况下有时会有所帮助。
for(i=container.begin(); i!=container.end(); ++i) {
if (boost::next(i) == container.end()) {
std::cout << "!" << std::endl;
}
}
虽然对于这种特殊情况,我只是输出第一个元素,从第二个到最后一个循环,同时总是输出','然后输出'!'循环结束后。 (正如其他人已经建议的那样)
我没有看到在循环中移动特殊情况,然后在循环中检查它们的重点.......
答案 2 :(得分:2)
在您的代码中,
if (i==container.end()) {
cout << "!" << endl;
}
永远不会发生。
我自己的方法是使用容器大小(我认为size()现在是所有标准库容器的常量时间)。保持循环中的计数,当count == size() - 1时,你就在结束时,并且当count == 0时,显然是。
答案 3 :(得分:2)
由于container
未定义,我使用了最简单的vector
template <class T>
string vector_join( const vector<T>& v, const string& token ){
ostringstream result;
for (typename vector<T>::const_iterator i = v.begin(); i != v.end(); i++){
if (i != v.begin()) result << token;
result << *i;
}
return result.str();
}
//usage
cout << vector_join( container, ", " ) << "!";
答案 4 :(得分:1)
稍稍移动++i
:
i = container.begin();
while(i != container.end()) {
if (i != container.begin()) {
cout << ", ";
}
cout << *i;
if (++i == container.end()) {
cout << "!" << endl;
}
}
答案 5 :(得分:1)
template < class TContainerType>
void print(TContainerType const & i_container)
{
typename TContainerTypeconst ::const_iterator current = i_container.begin();
typename TContainerTypeconst ::const_iterator const end = i_container.end();
if(current != end)
{
std::cout << *current++;
while(current != end)
std::cout << ", " << *current++;
}
std::cout << "!" << std::endl;
}
答案 6 :(得分:1)
将第二部分带出循环。
for(i=container.begin(); i!=container.end(); ++i) {
if (i != container.begin()) {
cout << ", ";
}
cout << *i;
}
cout << "!" << endl;