Как сэкономить время в списке в C ++ - PullRequest
2 голосов
/ 23 мая 2019

Я работаю над кодом C ++, в котором я пытаюсь сохранить chrono time в списке, чтобы позже я смог прочитать значение и вычислить продолжительность.

Причина сохранения времени вСписок состоит в том, что у меня есть несколько объектов, в которых мне нужно зафиксировать текущее время, когда этот объект был обнаружен, а затем, когда этот объект исчезает, мне нужно вычислить продолжительность времени для этого объекта.

list <double> dTimeList;

auto start = std::chrono::high_resolution_clock::now();

auto it = dTimeList.begin();
advance(it, detection.object_id);

dTimeList.insert(it, start ); //But this is giving error

Ошибка (активная) E0304 нет экземпляра перегруженной функции "std :: list <_Ty, _Alloc> :: insert [with _Ty = double, _Alloc = std :: allocator]" соответствует списку аргументов

Ошибка C2664 'std :: _ List_iterator >> std :: list <_Ty, std :: allocator <_Ty >> :: insert (std :: _ List_const_iterator >>, без знака __int64, const _Ty &)': невозможно преобразовать аргумент 2 из 'std :: chrono :: stable_clock :: time_point 'to' _Ty && '

Ответы [ 3 ]

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

std::chrono::high_resolution_clock::now() возвращает экземпляр

std::chrono::high_resolution_clock::time_point

... который по уважительным причинам не может быть конвертирован в double. Если вы хотите сохранить временные точки, у вас должен быть соответствующий список:

std::list<std::chrono::high_resolution_clock::time_point> dTimeList;
2 голосов
/ 23 мая 2019

Использование list<double> здесь неправильно. Вам необходимо сохранить список типа list<decltype(start)>, который совпадает с list<std::chrono::time_point<std::chrono::high_resolution_clock>>. Следующий код должен работать:

auto start = std::chrono::high_resolution_clock::now();
list <decltype(start)> dTimeList;

auto it = dTimeList.begin();
advance(it, detection.object_id);
dTimeList.insert(it, start );

Обратите внимание, что я изменил порядок или объявление списка и start. Вы также можете, конечно, использовать typedef / using декларатор.

И, наконец, для полноты, high_resolution_clock имеет собственный псевдоним для вышеуказанного типа, std::chrono::high_resolution_clock::time_point.

0 голосов
/ 23 мая 2019

Как отмечено в комментариях: «Вам нужно хранить правильный тип в вашем списке, то есть std :: chrono :: high_resolution_clock :: time_point, а не double. Std :: chrono :: time_point не являются неявно конвертируемыми к числовым типам по понятным причинам. "

Ниже приведен небольшой рабочий пример:

#include <iostream>
#include <chrono>
#include <vector>
#include <thread>

int main()
{
    std::vector<std::chrono::time_point<std::chrono::system_clock>> dTimeList;

    dTimeList.push_back(std::chrono::high_resolution_clock::now());
    std::this_thread::sleep_for (std::chrono::seconds(1));
    dTimeList.push_back(std::chrono::high_resolution_clock::now());

    std::chrono::duration<double> difference = dTimeList[0]-dTimeList[1];
    std::cout << "Time difference is: " << difference.count() << std::endl;
    return 0;
}
...