Положение в Векторе с помощью STL

Другое событие 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));
}

17
задан 3 revs, 3 users 67% 22 December 2015 в 13:00
поделиться

3 ответа

min_element уже дает Вам итератор, никакая потребность вызвать find (дополнительно, это неэффективно, потому что это - дважды работа). Используйте distance или - оператор:

cout << "min value at " << min_element(v2.begin(), v2.end()) - v2.begin();
34
ответ дан 30 November 2019 в 10:25
поделиться

Короткий ответ на то, что Вы думаете, что спросили с, "Как я определяю положение в 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;
7
ответ дан 30 November 2019 в 10:25
поделиться

Оба алгоритма Вы используете итераторы возврата. При разыменовании итератора Вы получаете объект, на который "указывает" этот итератор, который является, почему Вы печатаете значение а не положение при выполнении

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()));
15
ответ дан 30 November 2019 в 10:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: