我有2个迭代器range_begin,range_end,它们是我的容器。我需要找到所有以char前缀开头的字符串。 这是我的代码:
template <typename RandomIt>
pair<RandomIt, RandomIt> FindStartsWith(
RandomIt range_begin, RandomIt
range_end,char prefix){
auto it=equal_range(range_begin,range_end,prefix,
[prefix](const string& city){return city[0]==prefix;});
return it;}
例如,对于
const vector<string> sorted_strings = {"moscow", "murmansk", "vologda"};
auto it=FindStartsWith(strings.begin(),strings.end(),'m');
我想让迭代器的第一个出现在“ moscow”上,最后一个出现在“ murmansk”之后。
我收到奇怪的编译错误。有什么问题,我该怎么解决?我无法编写正确的lambda补偿器。
答案 0 :(得分:2)
equal_range
需要一个带有两个参数的比较函数。您正在传递带有一个函数。
异构调用(其中value
的类型与范围中的类型元素不同的调用)需要一个比较函数,该函数可以采用两种顺序中的任何一种。 Lambda在这种情况下不起作用,因为它只有一个operator()
重载。
最后,该函数必须执行小于类型的比较,而不是等于类型的比较。大致来说,equal_range
返回一个范围,从第一个元素!(element < value)
到第一个元素value < element
。
答案 1 :(得分:1)
您的错误可能是由于 strings.begin()和.end()没有 sorted _ 而引起的。我也不认为您也应该使用模板。除了错误,我建议您使用其他的std函数。一个更简单的解决方案是使用foreach:
#include <algorithm>
#include <iterator>
#include <list>
#include <string>
#include <utility>
#include <vector>
typedef std::vector<std::string>::const_iterator RandomIt;
std::vector<std::string> FindStartsWith(RandomIt start, RandomIt end, const char prefix) {
std::vector<std::string> result;
std::for_each(start, end, [&](auto city) {
if (city.front() == prefix) {
result.push_back(city);
}
});
return result;
}
int main(int argc, char* argv[]) {
const std::vector<std::string> sorted_strings = { "moscow", "murmansk", "vologda" };
auto prefix_cities = FindStartsWith(sorted_strings.begin(), sorted_strings.end(), 'm');
return 0;
}
肯定可以使用重构,但是我假设出于某些其他原因,您需要在FindStartsWith中实现它。
感谢您的发帖,这使我学到了很多有关equal_range:)