Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
min_element
уже дает Вам итератор, никакая потребность вызвать find
(дополнительно, это неэффективно, потому что это - дважды работа). Используйте distance
или -
оператор:
cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
Короткий ответ на то, что Вы думаете, что спросили с, "Как я определяю положение в std::vector<>
, учитывая итератор от него?" функция std::distance
.
то, Что Вы, вероятно, означали делать, однако, должно было получить значение для итератора, который Вы получаете путем разыменования его:
using namespace std;
vector<int>::const_iterator it = min_element(v2.begin(), v2.end());
cout << "min value at position " << distance(v2.begin(), it) << " is " << *it;
Оба алгоритма Вы используете итераторы возврата. При разыменовании итератора Вы получаете объект, на который "указывает" этот итератор, который является, почему Вы печатаете значение а не положение при выполнении
cout << "min value at position " << *find(v2.begin(), v2.end(), value);
, итератор может рассматриваться как указатель (хорошо, не точно, но скажем, так ради простоты); поэтому, один только итератор не может дать Вам положение в контейнере. Так как Вы выполняете итерации вектора, можно использовать минус оператор, как сказал Konrad:
cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
, но я рекомендовал бы использовать станд.:: алгоритм расстояния, который намного более гибок и будет работать над всеми стандартными контейнерами:
cout << "min value at " << distance(v2.begin(), min_element(v2.begin(), v2.end()));