C ++ - почему не применять ptr_fun к ciCharLess при вызове lexicographic_compare - PullRequest
1 голос
/ 03 мая 2011

Вопрос 1>

Я хотел бы знать, почему в случае I мы должны использовать not2 (ptr_fun (ciCharCompare)) * , тогда как в случае II нам просто нужно использовать ciCharLess,Почему бы не использовать ptr_fun (ciCharLess) вместо?

Вопрос 2>

Есть ли общее правило, которому я могу следовать, когда использовать какую форму?

Спасибо

case I:

int ciCharCompare(char c1, char c2)
{
// case-insensitively compare chars c1 and c2
// return -1 if c1 < c2
// return 0  if c1 == c2
// return 1  if c1 > c2
}

string s1("Test 1");
string s2("test 2222222222222222");

pair<string::const_iterator, string::const_iterator>
    p = mismatch(s1.begin(), s1.end(),
                 s2.begin(),
                 not2(ptr_fun(ciCharCompare))));

http://www.cplusplus.com/reference/algorithm/mismatch/

template <class InputIterator1, class InputIterator2, class BinaryPredicate>
pair<InputIterator1, InputIterator2>
mismatch (InputIterator1 first1, InputIterator1 last1,
          InputIterator2 first2, BinaryPredicate pred );

пред :
Двоичный предикат, принимающий два элемента в качестве аргумента

Case II:    
bool ciCharLess(char c1, char c2)
{
    // return true if c1 precedes c2 in a case insensitive comparison
}

lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(),
                         ciCharLess);

http://www.cplusplus.com/reference/algorithm/lexicographical_compare/

comp :
Объект функции сравнения, который, принимая два значения того же типа, что и значения, содержащиеся в диапазоне, возвращает true, если должен рассматриваться первый аргументменьше, чем второй аргумент.

1 Ответ

2 голосов
/ 03 мая 2011

Почему бы вместо этого не использовать ptr_fun (ciCharLess)?

Вы можете использовать ptr_fun(ciCharLess), если хотите.Все, что делает ptr_fun, это конвертирует указатель вашей функции в функтор , который содержит некоторые определения типа, такие как result_type.Большинству алгоритмов это не нужно, но некоторым (особенно связующим, таким как not2) это действительно нужно.

Вообще говоря, потому что вы никогда не будете неправильным при использовании ptr_fun для типа указателя на функцию (примечание: применять его к типу, который уже является функтором - это неправильно), я просто использую его везде.Самое худшее, что может случиться тогда, - это когда кто-то немного приподнимает брови, спрашивая, зачем обертка, если в этом нет необходимости.Если вы его не используете и нуждаетесь в этом, компилятор будет довольно громко жаловаться на вас.

Для получения дополнительной информации о конкретных битах, для которых ptr_fun, см. Эффективность Скотта МейерсаSTL Элемент 41: понять причины ptr_fun, mem_fun и mem_fun_ref.

(Короче говоря, эти адаптеры переплета необходимы для устранения некоторых синтаксических несоответствий в языкенапример, функторы и указатели на функции называются как identifier(args), функции-члены, вызываемые с помощью указателя, object->identifier(args), а функции-члены, вызываемые с помощью ссылки, object.identifier(args).)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...