Как обнаружить последний элемент внутри итератора карты - PullRequest
3 голосов
/ 15 мая 2019

Я хочу иметь возможность обнаруживать последнюю итерацию в моем итераторе карты. Как бы я этого достиг?

class JSON {
public:
    static void stringify(map<string, string> data)
    {
        string base;

        base += "{ ";

        for (map<string, string>::iterator it = data.begin(); it != data.end(); ++it)
        {
            cout << it->first.c_str() << " => " << it->second.c_str() << endl;
        }
    }
};

Ответы [ 4 ]

5 голосов
/ 15 мая 2019

Вы можете использовать std :: prev следующим образом:

    for(auto it = data.begin(); it != data.end(); ++it)
    {
        if(it == std::prev(data.end()))
        {
            // this is the last iteration
        }

        std::cout << it->first << " => " << it->second << '\n';
    }

std :: prev возвращает предыдущий итератор из егопараметр. * +1010 *

3 голосов
/ 15 мая 2019

Внутри каждой итерации цикла вы можете проверить, совпадает ли итератор следующий с итератором end() карты, например:

static void stringify(map<string, string> data)
{
    string base;

    base += "{ ";

    auto it = data.begin();
    auto end = data.end();

    while (it != end)
    {
        auto next_it = std::next(it);

        if (next_it == end) {
            cout << "this is the last iteration!" << endl;
        }

        cout << it->first << " => " << it->second << endl;

        it = next_it;
    }
}

Или:

static void stringify(map<string, string> data)
{
    string base;

    base += "{ ";

    auto it = data.begin();
    auto end = data.end();

    if (it != end)
    {
        do
        {
            cout << it->first << " => " << it->second << endl;

            auto next_it = std::next(it);
            if (next_it == end) {
                cout << "that was the last iteration!" << endl;
                break;
            }

            it = next_it;
        }
        while (true);
    }
}

Если ваша цель - просто не вставлять запятую в вывод JSON на первой или последней итерации (в зависимости от того, где в вашем коде вы хотите выполнить эту вставку), вы можете сделать это следующим образом:

static void stringify(map<string, string> data)
{
    string base = "{";

    auto it = data.begin();
    auto end = data.end();

    if (it != end)
    {
        cout << it->first << " => " << it->second << endl;

        base += (" \"" + it->first + "\": \"" + it->second + "\"");

        while (++it != end)
        {
            cout << it->first << " => " << it->second << endl;

            base += (", \"" + it->first + "\": \"" + it->second + "\"");
        }
    }

    base += " }";
}
1 голос
/ 15 мая 2019

Вы можете просто переместить проверку границ итератора в тело цикла:

void stringify(map<string, string> data){
    string base;

    base += "{ ";

    for (map<string, string>::iterator it = data.begin();;){
        if (it == data.end()){
            cout << "Last iteration!";
            break;
        }
        cout << it->first << " => " << it->second << endl;
        ++it;
    }
}

Обратите внимание, что код в операторе if будет вызываться для пустой карты.

1 голос
/ 15 мая 2019

Этого можно достичь, создав индекс, увеличивая индекс на каждой итерации вашей карты, а затем для каждой итерации сравнивая размер вашей карты с индексом.

class JSON {
public:
    static void stringify(map<string, string> data)
    {
        string base;
        int index = 0;

        base += "{ ";

        for (map<string, string>::iterator it = data.begin(); it != data.end(); ++it)
        {
            if (data.size() - 1 == index)
            {
                // Do stuff here
            }

            cout << it->first.c_str() << " => " << it->second.c_str() << endl;
            index++;
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...