проверка, не удается ли выполнить std :: find при поиске в векторе векторов - PullRequest
1 голос
/ 11 октября 2011

Проблема, с которой я сталкиваюсь, заключается в том, что std::find возвращает <someVector>.end(), если это не удается, но что, если вы не знаете, что <someVector> ??

Структура для поиска: hashtable (вектор H векторов класса X) индекс (i) внешнего вектора H находится с использованием хеш-функции std::find, которая используется для поиска по сигнатуре H [i] -функции: <return val> lookup (hashtable H,) [<return val>является дескриптором элемента, найденного поиском, так что мы можем изменить его значение по мере необходимости]

vector<X>::iterator lookup (vector <vector <X>> &H, X some_value)
{
     int index = hashFn(some_value);
    return std::find(H[index].begin(), H[index].end(), some_value);
}

как мне проверить в этом случае, если поиск не удается ??(если я изменю вектор на массивы / указатели, я могу просто вернуть NULL и сделка будет завершена, но как мне сделать это при возврате итераторов ??)

Ответы [ 3 ]

4 голосов
/ 11 октября 2011

std::find(a,b, V) не возвращается .end();он возвращает свой второй аргумент.Поскольку вы, вызывающий объект, передали этот аргумент, вы всегда его знаете.

Теперь в вашем более сложном примере выясняется, что проблема заключается в том, что вызывающий std::find() должен вернуть своему вызывающему.Это то, что мы не можем сказать;мы даже не знаем подпись.Вы можете вернуть пустой вектор, построенный по умолчанию (см. Ответ Мониша).Вы можете выбросить исключение (если это имеет смысл, концептуально).Вы можете вернуть константную ссылку на статический пустой вектор.

2 голосов
/ 11 октября 2011

Без возможности доступа к самому вектору единственное, что вы можете сделать с помощью итератора, - это извлечь элемент, на который указывает этот итератор. Так почему же вы не хотите возвращать const X * или X * вместо vector :: iterator? В случае неудачи вы можете просто вернуть 0 (или nullptr, если вы используете C ++ 11). Вот об интерфейсе. Как насчет того, как вы можете обнаружить сбой std :: find в вашем алгоритме поиска - я согласен с MSalters - где-то в вашем коде есть вызов std :: find с доступными аргументами - так что вы можете просто сравнить результат со вторым аргументом в этом месте и вернуть нулевой указатель на равенство.

X * lookup ( vector <vector <X>> &H, X some_value )
{
  int index = hashFn(some_value);
  vector<X> &v = H[index];
  const vector<X>::iterator result = std::find( v.begin(), v.end(), some_value );
  if ( result != v.end() ) {
    return &(*result);
  } else {
    return 0;
  }
}

Использование:

X * value = hash_table.lookup(...);
if ( X != 0 ) {
  // use result
} else {
  // value not found
}

И снова - вы не сможете использовать итератор любым другим способом без доступа к вектору, поэтому бессмысленно использовать vector :: iterator в качестве возвращаемого типа поиска;

0 голосов
/ 11 октября 2011

Если тип возвращаемого значения - вектор , то вы можете вернуть пустой вектор в случае сбоя поиска.

обратный вектор ();

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