2015-05-06 15 views
22

Tôi có một mã trong C++ 14. Tuy nhiên, khi tôi sử dụng nó trong C++ 11, nó có lỗi tại const auto. Làm thế nào để sử dụng nó trong C++ 11?Làm thế nào để sử dụng tham số tự động lambda trong C++ 11

vector<vector <int> > P; 
std::vector<double> f; 
vector< pair<double, vector<int> > > X; 
for (int i=0;i<N;i++) 
     X.push_back(make_pair(f[i],P[i])); 

////Sorting fitness descending order 
stable_sort(X.rbegin(), X.rend()); 
std::stable_sort(X.rbegin(), X.rend(), 
       [](const auto&lhs, const auto& rhs) { return lhs.first < rhs.first; }); 
+4

Yeah, chỉnh sửa mà về cơ bản thay đổi câu hỏi là thực sự không thích hợp ở đây, tôi đã gỡ bỏ nó. Tôi hiểu rằng bạn không đăng bài ở đây nhiều và rằng những gì bạn đã làm * là * thường được chấp nhận trên diễn đàn, vì vậy tôi có thể hiểu lý do bạn đã làm, nhưng bạn có thể hỏi nhiều câu hỏi riêng biệt có liên quan tại đây, miễn là tất cả các câu hỏi hay có ý nghĩa riêng. – hvd

Trả lời

27

C++ 11 không hỗ trợ chung lambdas. Đó là những gì auto trong danh sách tham số lambda của thực sự là viết tắt của: một tham số chung, có thể so sánh với các tham số trong một mẫu hàm. (Lưu ý rằng const không phải là vấn đề ở đây.)

Bạn có cơ bản hai lựa chọn:

  1. Gõ ra đúng loại thay vì auto. Đây là loại phần tử của X, là pair<double, vector<int>>. Nếu bạn thấy điều này không đọc được, typedef có thể giúp bạn.

    std::stable_sort(X.rbegin(), X.rend(), 
           [](const pair<double, vector<int>> & lhs, 
            const pair<double, vector<int>> & rhs) 
           { return lhs.first < rhs.first; }); 
    
  2. Thay lambda với một functor trong đó có một nhà điều hành gọi mẫu. Đó là cách lambdas chung về cơ bản được thực hiện đằng sau hiện trường. Các lambda là rất chung chung, vì vậy hãy xem xét đặt nó trong một số tiêu đề tiện ích toàn cầu. (Tuy nhiên không using namespace std; nhưng gõ ra std:: trong trường hợp bạn đặt nó trong một tiêu đề.)

    struct CompareFirst { 
        template <class Fst, class Snd> 
        bool operator()(const pair<Fst,Snd>& l, const pair<Fst,Snd>& r) const { 
         return l.first < r.first; 
        } 
    }; 
    
    std::stable_sort(X.rbegin(), X.rend(), CompareFirst()); 
    
2

const auto không được hỗ trợ trong C++ 11 dưới dạng thông số lambda (thực tế lambdas chung không được hỗ trợ trong C++ 11).

Để khắc phục:

using pair_type = std::pair<double, std::vector<int>>; 
vector<pair_type> X; 

std::stable_sort(X.rbegin(), X.rend(), 
       [](const pair_type&lhs, const pair_type& rhs) 
       { return lhs.first < rhs.first; }); 
8

Tôi biết có một câu trả lời được chấp nhận, nhưng bạn cũng có thể sử dụng decltype trong C++ 11 cho điều này, nó trông hơi lộn xộn ...

stable_sort(X.rbegin(), X.rend(), [](decltype(*X.cbegin()) lhs, decltype(lhs) rhs) { return lhs.first < rhs.first; }); 

Sử dụng cbegin() tại đây khi bạn nhận được const đúng value_type của vùng chứa.

2

Hoặc bạn có thể trực tiếp sử dụng value_type typedef của container với một decltype, như

std::stable_sort(X.rbegin(), X.rend(), 
       [](const decltype(X)::value_type & lhs, 
        const decltype(X)::value_type & rhs) 
        {return lhs.first < rhs.first; } 
       ); 
+0

Nếu tôi không nhầm, bạn chỉ cần gõ 'X.value_type' thay vì' decltype (X) :: value_type'. – leemes

+2

@leemes Tôi không nghĩ vậy, 'value_type' là một' typedef' lồng nhau, do đó bạn cần truy cập phạm vi thông qua '::'. Trực tiếp [ở đây] (http://ideone.com/fAMF40) và câu hỏi liên quan [ở đây] (http://stackoverflow.com/q/21290875/3093378). – vsoftco

+0

Cảm ơn, tôi rất vui vì bộ não của tôi đã đưa ra một cảnh báo khi tôi nghĩ rằng điều đó là có thể. – leemes

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