std :: find с типом T ** против T * [N] - PullRequest
0 голосов
/ 09 февраля 2012

Я предпочитаю работать с std::string, но мне нравится выяснять, что здесь происходит не так.

Я не могу понять, почему std::find не работает должным образом для типа T**, хотя арифметика с указателями работает на них правильно. Нравится -

std::cout << *(argv+1) << "\t" <<*(argv+2) << std::endl;

Но работает нормально, для типов T*[N].

#include <iostream>
#include <algorithm>

int main( int argc, const char ** argv )
{   
    std::cout << *(argv+1) << "\t" <<*(argv+2) << std::endl;

    const char ** cmdPtr = std::find(argv+1, argv+argc, "Hello") ;

    const char * testAr[] = { "Hello", "World" };
    const char ** testPtr = std::find(testAr, testAr+2, "Hello");

    if( cmdPtr == argv+argc )
        std::cout << "String not found" << std::endl;

    if( testPtr != testAr+2 )
        std::cout << "String found: " << *testPtr << std::endl;

    return 0;
}

Аргументы переданы: Hello World

Выход:

Hello World
Строка не найдена
Найдена строка: Hello

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

В первом случае вы сравниваете сами значения указателя, а не то, на что они указывают.И константа «Hello» не имеет того же адреса, что и первый элемент argv.

. Попробуйте использовать:

const char ** cmdPtr = std::find(argv+1, argv+argc, std::string("Hello")) ;

std::string знает, что сравнивать содержимое, а не адреса.

Для версии массива компилятор может сложить все литералы в один, поэтому каждый раз, когда во всем коде встречается «Hello», это действительно один и тот же указатель.Таким образом, сравнение на равенство в

const char * testAr[] = { "Hello", "World" };
const char ** testPtr = std::find(testAr, testAr+2, "Hello");

дает правильный результат

1 голос
/ 09 февраля 2012

Сравнение типов char const* означает указание на адреса.Адрес "Hello" гарантированно будет другим, если вы не сравните его с другим адресом строкового литерала "Hello" (в этом случае указатели могут сравниваться равными).Ваша функция compare() сравнивает символы, на которые указывают.

...