为什么 lambda 函数不适用于 std::min_element?
Why lambda function doesn't work with 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::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;
}
问题是最后一个参数。它期待一个Compare
,简单来说,Compare
接受两个参数并返回 true 或 false。请参阅从 cplusplus 获取的min_element的模板定义:
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
的更多信息,因为您最终会经常使用它。希望对您有所帮助。
虽然没有回答这个问题,但解决方案是首先按字符串长度对向量进行排序,然后在std::find_if
中使用lambda函数
您可以定义比较函数,以便长度小于或等于 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(,则表示所有元素都很短。
如果数据未排序,并且您只需要查找一次最小值,则可能是最快的方法。否则(如果需要按顺序处理项目(,最好先按照其他解决方案中的建议对数据进行排序。
- 如何使用std::min和std::less返回对象
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 关于 std::min, std::max 中的比较运算符的混淆
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 为什么将 1 添加到 numeric_limits<float>::min() 返回 1?
- 如何将 bsoncxx::d ocument::element 写入控制台
- 在儿童的特定情况下,向下渗透MIN二进制堆失败
- 在f2c.h文件中定义min()max()宏时出错
- 如何解决g++问题"internal compiler error: Illegal instruction min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MI
- 第 5 行:字符 54:错误:调用"min(int,std::__cxx11::basic_string<char>::size_type)"没有匹配函数
- 如何使用函数std::min()来计算最小值
- 在函数 'int main(int, char**) 中,没有声明 'MIN'
- 将迭代器值与 std::min 一起固定到 end()
- C++是否在 std::min 和 std::max 下标准化 std::optional 的行为?
- [bsoncxx ]如何附加一个bsoncxx::d ocument::element TO bsoncxx::buil
- c++ 中 std::min 的效率
- 当摆脱模偏差时,min = -upper_bound % upper_bound; // 如何工作?
- std :: min-设计考虑
- 如何在 OpenACC 中并行化内部具有"min"功能的循环
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错