Я пытаюсь использовать функцию lower_bound в C++. Используется несколько раз для 1 d типов данных.Применение C++ «lower_bound» в массиве символов char
Теперь я пробую его на sorted array dict[5000][20]
, чтобы найти строки size <=20
. Строка, которая должна быть сопоставлена, находится в str
.
bool recurseSerialNum(char *name,int s,int l,char (*keypad)[3],string str,char (*dict)[20],int
dictlen)
{
char (*idx)[20]= lower_bound(&dict[0],&dict[0]+dictlen,str.c_str());
int tmp=idx-dict;
if(tmp!=dictlen)
printf("%s\n",*idx);
}
Согласно http://www.cplusplus.com/reference/algorithm/lower_bound/?kw=lower_bound, эта функция должна возвращать индекс «последний» (за конец) в случае, если совпадение не найдено, т.е. tmp
должен быть равен dictlen
. В моем случае он всегда возвращает начальный индекс i.e. Я получаю tmp equal to 0
как 1. Когда передана строка, которая есть в dict
и 2. При передаче строки, которой нет в dict
.
Я думаю, что проблема заключается в обработке и передаче указателя. default comparator
должен быть доступен для этого случая, как доступно в случае вектора. Я также попытался передать явный, безрезультатно.
Я попробовал этот компаратор -
bool compStr(const char *a, const char *b){
return strcmp(a,b)<0;
}
Я знаю, что ALTERNATE
это используется вектор, и т.д., но я хотел бы знать, вопрос в этом. Искал на этом через google так же как SO, но не нашел ничего подобного.
Компаратор сравнения по умолчанию для указателей сравнивает указатели. Для сравнения строк вам нужен собственный компаратор '[] (char * lhs, char * rhs) {return strcmp (lhs, rhs) <0; } '. – zch
@zch - Я добавил выше используемого мною компаратора. Это не работает. Более того, я не совсем понимаю синтаксис компаратора, о котором вы говорите. Пожалуйста, если вы можете разработать «[] (char * lhs, char * rhs) {return strcmp (lhs, rhs) <0;}" в рабочем синтаксисе. – user1412066
Это синтаксис C++ 11 для анонимных функторов, называемый [lambda expression] (http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B_.28since_C.2B.2B11.29).Эквивалент в C++ 03 был бы классом 'struct StrCmp {bool operator() (...) {...}};' и передачей 'StrCmp()' в качестве аргумента 'comp'. – zch