список > перебирать список, содержащий пары? - PullRequest
0 голосов
/ 02 февраля 2020

В рамках анализа времени выполнения у меня есть небольшая игра, в которой после вычисления каждого кадра помещается новый элемент в этот список:

typedef std::list<std::pair<float, float>> PairList;

PairList Frames; //in pair: index 0 = elapsed time, index 1 = frames 

Файл txt позже используется для рисования графика. Я решил использовать список, потому что во время игры мне не нужно обрабатывать данные, содержащиеся в списке, и я считаю, что списки являются самыми быстрыми контейнерами, когда речь идет только о добавлении или удалении элементов. В качестве следующего шага я хочу записать кадры во внешний текстовый файл.

void WriteStats(PairList &pairList)
{
    // open a file in write mode.
    std::ofstream outfile;
    outfile.open("afile.dat");

    PairList::iterator itBegin = pairList.begin();
    PairList::iterator itEnd = pairList.end();

    for (auto it = itBegin; it != itEnd; ++it)
    {
        outfile << *it.first << "\t" << *it.second;
    }
    outfile.close();

}

С обычными списками указатель на "оно" должен возвращать элемент правильно? За исключением Visual Studio говорит, что pair<float, float>* не имеет члена с именем first Как я хочу сделать это тогда, когда доступ через мой итератор не работает? Это потому что я передаю ссылку на список?

Ответы [ 3 ]

2 голосов
/ 02 февраля 2020

*it.first анализируется как *(it.first).

Вам нужно (*it).first или, еще лучше it->first.

Или, еще лучше, используйте диапазон для:

for (auto& elem : pairList)
{
    float a = elem.first;
}

Я решил использовать список, потому что [...] я считаю списки самыми быстрыми контейнерами, когда речь идет только о добавлении или удалении элементов.

Первый go -контейнер должен быть std::vector. На практике он превосходит std::list даже по алгоритмам, которые на бумаге должны быть быстрее на std::list из-за локальности кэша. Поэтому я бы проверил вашу теорию с помощью хорошего бенчмаркинга, если производительность вызывает беспокойство.

1 голос
/ 02 февраля 2020

Проблема связана с приоритетом оператора . В частности, оператор доступа члена '.' имеет более высокий приоритет, чем косвенное указание '*', поэтому *it.first фактически анализируется как ...

*(it.first)

Отсюда и предупреждение. Вместо этого используйте ...

it->first
0 голосов
/ 02 февраля 2020

Используйте на основе диапазона для l oop вместо того, чтобы возиться с итераторами:

void WriteStats(const PairList &pairList)
{
    // open a file in write mode.
    std::ofstream outfile("afile.dat");

    for (const auto &elem : pairList) {
      outfile << elem.first << "\t" << elem.second << '\n';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...