在创建语法列表(使用逗号)时,我多次使用类似的代码:
std::stringstream list;
int i = 0;
for (auto itemListIt = itemList.begin(); itemListIt != itemList.end(); itemListIt++)
{
list << *itemListIt;
if (i < itemList.size() - 1) list << ", ";
i++;
}
有没有更简洁的方法呢,也许没有额外的变量 - '我'?
答案 0 :(得分:3)
为什么不测试你真正感兴趣的东西; “这之后还有另一个元素吗?”。
std::stringstream list;
for (auto it = roomList.begin(); it != itemList.end(); it++)
{
list << *it;
if ( it+1 != itemList.end() ) list << ", ";
}
答案 1 :(得分:1)
有两个简单的解决方案。首先是使用while
循环:
auto itemListIt = itemList.begin();
while ( itemListIt != itemList.end() ) {
list << *itemListIt;
++ itemListIt;
if ( itemListIt != itemList.end() ) {
list << ", ";
}
}
第二个解决方案是稍微改变逻辑:而不是
如果还有更多内容需要附加", "
,如果不是,请加上前缀1
第一个要素:
for ( auto itemListIt = itemList.begin(); itemListIt != itemList.end(); ++ itemListIt ) {
if ( itemListIt != itemList.begin() ) {
list << ", ";
}
list << *itemListIt;
}
答案 2 :(得分:1)
您可以使用--items.end()
将所有内容循环到倒数第二个。
然后使用items.back()
输出最后一个。
#include <algorithm>
#include <iterator>
#include <sstream>
#include <vector>
#include <iostream>
int main()
{
std::ostringstream oss;
std::vector<int> items;
items.push_back(1);
items.push_back(1);
items.push_back(2);
items.push_back(3);
items.push_back(5);
items.push_back(8);
if(items.size() > 1)
{
std::copy(items.begin(), --items.end(),
std::ostream_iterator<int>(oss, ", "));
oss << "and ";
}
// else do nothing
oss << items.back();
std::cout << oss.str();
}
输出:
1, 1, 2, 3, 5, and 8
答案 3 :(得分:0)
以下内容适用于任何InputIterator
输入:
std::stringstream list;
auto it(std::begin(input)); //Or however you get the input
auto end(std::end(input));
bool first(true);
for (; it != end; ++it)
{
if (!first) list << ", ";
else first = false;
list << *it;
}
或者没有额外的变量:
std::stringstream list;
auto it(std::begin(input)); //Or however you get the input
auto end(std::end(input));
if (it != end)
{
list << *it;
++it;
}
for (; it != end; ++it)
{
list << ", " << *it;
}
答案 4 :(得分:0)
如果您想使用其他人建议的无法进行随机访问的地图或其他迭代器,请检查第一个元素:
std::stringstream query;
query << "select id from dueShipments where package in (";
for (auto it = packageList.begin(); it != packageList.end(); it++)
{
if (it != packageList.begin()) query << ", ";
query << it->second;
}
query << ")";