2015-07-14 14 views
6

Tôi có một chương trình mẫu chứa 6 timepoints sử dụng high_resolution_clock::now() từ tiêu đề chrono tiêu đề. Tôi có sự khác biệt b/w mỗi người trong số họ dẫn đến 3 sự khác biệt và đánh giá họ là auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); đến micro giây.không có chức năng phù hợp cho cuộc gọi đến tiêu chuẩn :: vector <std::tuple> push_back

Tôi có một biến khác có tên thời lượng được chỉ định như sau: auto durations = std::make_tuple(duration1,duration2,duration3); chứa chênh lệch thời gian trước đó.

tôi phải đẩy tuple này vào một vector, vì vậy tôi đã giới thiệu std::vector<std::tuple<std::chrono::microseconds,std::chrono::microseconds,std::chrono::microseconds>> list; Tuy nhiên về việc sử dụng list.push_back(durations); tôi nhận được một lỗi như:

prog.cpp: In function 'int main()': 
prog.cpp:36:29: error: no matching function for call to 'std::vector<std::tuple<std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >, std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >, std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> > > >::push_back(std::tuple<long long int, long long int, long long int>&)' 
    list.push_back(durations); 

tôi đã cố gắng để tìm kiếm về std::chrono::microsecondsstd::chrono::duration khác thứ here nhưng không thành công trong việc khắc phục vấn đề.

Tôi biết điều này có liên quan đến sự sơ suất của hệ thống kiểu, nhưng tôi không thể xác định được lỗi đó. Mọi trợ giúp sẽ được đánh giá cao, & đây là ideone link.

#include <iostream> 
#include <chrono> 
#include <vector> 
#include <tuple> 

using namespace std; 
using namespace std::chrono; 

void function() 
{ 
    long long number = 0; 

    for(long long i = 0; i != 2000000; ++i) 
    { 
     number += 5; 
    } 
} 

int main() 
{ 
    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t3 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t5 = high_resolution_clock::now(); 
    function(); 
    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t4 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t6 = high_resolution_clock::now(); 

    auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); 
    auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>(t4 - t3).count(); 
    auto duration3 = std::chrono::duration_cast<std::chrono::microseconds>(t6 - t5).count(); 

    auto durations = std::make_tuple(duration1,duration2,duration3); 

    std::vector<std::tuple<std::chrono::microseconds,std::chrono::microseconds,std::chrono::microseconds>> list; 
    list.push_back(durations); 

    cout << duration1 << " -- "<< duration2 << " -- "<< duration3 << " -- "; 
    return 0; 
} 

Trả lời

5

Bạn đã tạo một bộ gồm 3 số nguyên và bạn đang cố gắng thêm nó vào vectơ 3 thời lượng.

Tôi có sự khác biệt b/w mỗi kết quả trong số đó dẫn đến 3 khác biệt và xếp hạng chúng là auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); đến micro giây.

Tại sao bạn gọi count() trong khoảng thời gian sau khi thực hiện duration_cast để chuyển đổi thành micro giây?

Chỉ cần giữ các giá trị như microseconds đối tượng và bạn có thể thêm chúng vào vector:

auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1); 
auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>(t4 - t3); 
auto duration3 = std::chrono::duration_cast<std::chrono::microseconds>(t6 - t5); 
+1

cũng xin cảm ơn vì công việc của bạn trên cpp :) –

4

Loại std::chrono::microseconds::count() không phải là std::chrono::microseconds, đó là một số ký kiểu không thể thiếu.

auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count(); 
//decltype(duration1) is not std::chrono::microseconds 

Như vậy, bạn không thể sử dụng duration*n* biến của bạn cho một vector mong microsecond giá trị.

Việc sửa chữa rất dễ dàng, chỉ trì hoãn cuộc gọi của bạn count cho đến khi bạn thử và in nội dung.

2

Bạn đang nhận loại không phù hợp.

auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count() 

Thực tế cung cấp cho bạn long long trong trường hợp của bạn chứ không phải là std::chrono::microseconds.Bạn có thể khắc phục điều này bằng cách sử dụng decltype() và thay đổi

std::vector<std::tuple<std::chrono::microseconds,std::chrono::microseconds,std::chrono::microseconds>> list; 

Để

std::vector<decltype(durations)> list; 

Live Example

4

Rất đơn giản: không gọi count.

std::chrono::microseconds là (trong trường hợp của bạn) một typedef cho loại std::chrono::duration<long long int, std::ratio<1ll, 1000000ll> >. Đó cũng là loại bạn nhận được từ việc thực hiện std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).

Tuy nhiên, đó không phải là những gì bạn đang chỉ định cho duration1. Bạn đang chỉ định kết quả của việc gọi hàm count trên loại đó. Và điều đó trả về số lượng ve là một số (long long int trong trường hợp của thư viện chuẩn của bạn), và không phải là duration.

Các vấn đề liên quan