簡體   English   中英

為什么Lambda函數不能與std :: min_element一起使用?

[英]Why lambda function doesn't work with std::min_element?

我編寫了一個程序,使用std::min_element在字符串向量中找到按字典順序std::min_element的最小字符串,但是我想獲取長度大於1的最小字符串。我嘗試使用lambda表達式來執行std::min_element我遇到了編譯錯誤。

我已經嘗試過搜索,但是什么也解決不了。

vector<string> names{"Jason", "Peter", "A", "Ac", "O"};
cout << *min_element(names.begin(), names.end(), [](string s) {return s.length() > 1;}) << '\n';

PS:我希望它會打印“ Ac”。

std::min_element比較函數的簽名應等效於以下簽名。 這是您收到編譯錯誤的原因:

bool cmp(const Type1 &a, const Type2 &b);

由於operator<對於std::string重載以按字典順序進行比較,因此可以通過使用默認比較器對names進行排序,然后找到長度大於1的第一個元素來獲得所需的結果,如下所示:

現場演示

std::vector<std::string> names{"Jason", "Peter", "A", "Ac", "O"};

std::sort(names.begin(), names.end());

const auto it = std::find_if(
                    names.cbegin(), names.cend(),
                    [](const std::string& str){return str.size() > 1;});

if(it != names.cend()){
    std::cout << *it << std::endl;
}

如果要保留原始矢量names ,則應在排序之前將其復制,或按如下所示使用std::set

實時演示(std :: set)

std::vector<std::string> names{"Jason", "Peter", "A", "Ac", "O"};

std::set<std::string> s(names.cbegin(), names.cend());

const auto it = std::find_if(
                    s.cbegin(), s.cend(),
                    [](const std::string& str){return str.size() > 1;});

if(it != s.cend()){
    std::cout << *it << std::endl;
}

盡管未回答問題,但解決方案是std::find_if字符串長度對向量進行排序,然后在std::find_if使用lambda函數

問題是最后一個參數。 它期望有一個Compare ,並且很簡單, Compare需要兩個參數並返回true或false。 見取自min_element的模板定義CPLUSPLUS

template <class ForwardIterator, class Compare>
ForwardIterator min_element (ForwardIterator first, ForwardIterator last, Compare comp);

您可以輕松解決它,添加另一個參數並忽略它。

vector<string> names{"Jason", "Peter", "A", "Ac", "O"};
cout << *min_element(names.begin(), names.end(), [](string s, string y) {return s.length() > 1;}) << '\n';

您還可以搜索更多有關Compare因為最終會經常使用它。 希望能幫助到你。

您可以定義比較函數,以使長度小於或等於1的元素大於較長的元素。

bool special_comparison(const std::string &s1, const std::string &s2)
{
    // Make a short string appears greater than a longer one.
    bool shortString1 = s1.size() <= 1;
    bool shortString2 = s2.size() <= 1;
    if (shortString1 != shortString2)
        return shortString2;

    // Regular comparison if both strings are short or both are long.
    return s1 < s2;
}

如果最小元素的長度為1(或0),則表示所有元素都較短。

如果數據未排序,而您只需要查找一次即可,那可能是最快的方法。 否則(如果您需要按順序處理項目),最好先按照其他解決方案中的建議對數據進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM