如何在没有其他变量的情况下获得当前位置?

时间:2012-03-15 07:29:52

标签: c++ vector iterator

在创建语法列表(使用逗号)时,我多次使用类似的代码:

std::stringstream list;
int i = 0;
for (auto itemListIt = itemList.begin(); itemListIt != itemList.end(); itemListIt++)
{
    list << *itemListIt;
    if (i < itemList.size() - 1) list << ", ";
    i++;
}

有没有更简洁的方法呢,也许没有额外的变量 - '我'?

5 个答案:

答案 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 << ")";