我编写了一个程序,使用std::min_element
在字符串向量中查找按字典顺序排列的最小字符串,但是我想获得长度大于1的最小字符串。我尝试做std::min_element
使用lambda表达式,但出现编译错误。
我尝试搜索该内容,但无法解决任何问题。
vector<string> names{"Jason", "Peter", "A", "Ac", "O"};
cout << *min_element(names.begin(), names.end(), [](string s) {return s.length() > 1;}) << '\n';
PS:我希望它会打印“ Ac”。
答案 0 :(得分:2)
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;
}
答案 1 :(得分:0)
尽管没有回答问题,一种解决方案是先按字符串长度对向量进行排序,然后在std::find_if
中使用lambda函数
答案 2 :(得分:0)
问题是最后一个参数。它期望一个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
的更多信息,因为您将经常使用它。
希望对您有所帮助。
答案 3 :(得分:0)
您可以定义比较函数,以使长度小于或等于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),则表示所有元素都较短。
如果数据未排序,而您只需要查找一次即可,那可能是最快的方法。否则(如果您需要按顺序处理项目),最好先按照其他解决方案中的建议对数据进行排序。