Получение индекса элемента массива
Есть переменная int a=5 , которой инициализируем элемент массива int b[3]= , потом получаем переменную int a1=5 . Имея а1 нужно узнать равна ли она элементу массива, и если равна то, самое важное — получить индекс. Так вот, проблема в том, что это надо сделать не используя цикл. В .NET есть Array::IndexOf(Array^, Object^) , есть ли аналог в C++? Может шаблонные классы?
Отслеживать
3,789 1 1 золотой знак 20 20 серебряных знаков 31 31 бронзовый знак
задан 8 мар 2016 в 19:26
Алесандр Вогрик Алесандр Вогрик
115 1 1 золотой знак 1 1 серебряный знак 10 10 бронзовых знаков
Если и есть такой метод — то он все равно использует цикл.
8 мар 2016 в 19:29
Дак ведь у вас неупорядоченный массив, каким еще образом можно найти в нем искомый элемент (или вы чего-то недоговариваете)?
8 мар 2016 в 19:31
Ну возможно, он написан на ассемблере, что даст прирост производительности. А вообще мне кажется, что есть способ нахождения через адреса
8 мар 2016 в 19:31
Глупости. Если подумать, можно доказать, что меньше O(N) не получить
8 мар 2016 в 19:33
@StateItPrimitive а он и не должен быть упорядоченным, он заполняется в течении выполнения программы . Это важно?
8 мар 2016 в 19:34
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Не используя цикл, можно использовать алгоритм find из STL ( find_if в данном случае — перебор).
Есть и второй способ без применения циклов — применить рекурсию.
Но вы уверены, что вам нужно именно это? 🙂
Если вопрос в производительности — то быстрее цикла все равно ничего не будет, O(N) для неупорядоченного массива никак не переплюнуть.
Другое дело, что хранить эти значения можно не в массиве, а в том же unordered_set и получить свое за O(1) .
Отслеживать
ответ дан 8 мар 2016 в 20:08
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
Всем спасибо, решение найдено. Наиболее удачный вариант — std::map . Возможно он не изменяет О(N), однако, конкретно в моём случае он повысил производительность. Ещё хороший вариант — for(int i = 0; i < count; ++i)// count - размер массива vector[hwnd[i]] = i; , но я не много не понял как задавать индекс через HWND. reinterpret_cast помог, но с ним были другие заморочки. Ещё раз всем спасибо
Отслеживать
ответ дан 9 мар 2016 в 20:58
Алесандр Вогрик Алесандр Вогрик
115 1 1 золотой знак 1 1 серебряный знак 10 10 бронзовых знаков
Предисловие: в комментариях с автором выяснили, зачем ему это, прикладываю ответ
Так как обращение будет частое к массиву, то удобно применить вектор-индикатор. Ограничиваем максимальное значение в массиве MAX_VALUE и создаем int -массив размера MAX_VALUE . На начальном этапе ОДИН РАЗ инициализируем его примерно так:
for(int i = 0; i < count; ++i)// count - размер массива vector[hwnd[i]] = i;
Теперь чтобы узнать индекс элемента, достаточно обратиться к vector[i] - это и будет его индекс в массиве hwnd . Если нужно добавить/удалить значения в hwnd, то соответствующим образом поменять vector
как найти индекс элемента массива js
Для поиска индекса элемента массива существует метод indexOf() . Этот метод возвращает первый индекс, по которому элемент может быть найден в массиве. Если элемент отсутствует в массиве, то возвращается -1.
const letters = ['a', 'b', 'b', 'c', 'd', 'e']; console.log(letters.indexOf('a')); // => 0 console.log(letters.indexOf('b')); // => 1 console.log(letters.indexOf('e')); // => 5 console.log(letters.indexOf('z')); // => -1
Работа с массивами. Часть 1

Доброго времени суток, сегодня мы поговорим о массивах, разберём некоторые тонкости заполнения массивов в Си. Тема несложная, думаю, легко разберётесь. Итак, давайте начнём. Заполнить целочисленный массив array_int[N] (N = 34) числами из диапазона [-83; 90] и массив array_double[N] дробными числами из диапазона [-2.38; 6.57]. Вывести массивы на экран в две строки. Вывести массивы в файл в два столбца в формате «array_int[индекс] = значение; array_double[индекс]= значение». Код:
#include stdio.h> #include stdlib.h> #define N 34 int main(void) FILE*file; file = fopen("file.txt","w"); int array_int[N], i, j; for (i = 1; i = N; i++) array_int[i] = -83 +rand() % (90 + 83 + 1); printf("%d ", array_int[i]); > printf("\n"); double array_double[N],t; for (j = 1; j = N;) t = rand() % 8 - 2 + (rand() % 95 - 38) / 100.0; if ((t = 6.57 ) && (t >= -2.38)) array_double[j] = t; printf("%.2lf ", array_double[j]); j++; > > for (i = 1; i = N; i++) fprintf(file, "array_int[%d] = %d\t array_double[%d] = %.2lf \n ", i, array_int[i], i, array_double[i]); > fclose(file); return EXIT_SUCCESS; >

Вывод:
Команд новых нет, но поговорим об изюминке во втором цикле (при заполнении дробного массива): Чтобы заполнить массив дробными «рандомными» числами из диапазона [-2.38; 6.57], необходимо сначала сгенерировать целые числа rand() % 8 — 2, где 8 сумма целого чисел у границы (-2.38 и 6.57), затем уже сгенерировать дробную часть (rand() % 95 — 38) / 100.0, где 95 сумма границ ( 38 + 57 ).
Мы используем условие if ((t = -2.38)), чтобы быть точно уверенным, что результат будет именно в этом диапазоне. А также в этом примере я показал, что у цикла for переменная j может быть изменена не только в объявлении цикла, но и посередине его.
Следующий: Заполнить массив array[20] степенями числа 2, начиная с минус пятой степени. Вывести массив на экран в строку. Код:
#include stdio.h> #include stdlib.h> #include math.h> #define N 20 int main(void) int i,k; k = -5; double array[N]; for (i = 0; i N; i++) array[i] = pow(2,k); k++; printf("%.3lf ", array[i]); > return EXIT_SUCCESS; >
Как видите, ничего сложного. Если вы осилили предыдущие задачи в статьях, то это для вас будет так, пальцы размять =)
Едем дальше. Заполнить одномерный массив из 15 элементов случайными числами из диапазона [-30; 16]. Вывести на экран массив в строку. Найти первое с конца массива число, которое кратно 7, если таких чисел нет, то вывести сообщение о том, что чисел кратных семи не обнаружено. Использовать оператор break.
#include stdio.h> #include stdlib.h> #define N 15 int main(void) int mas[N], i, k = 0; for (i = 0; i N; i++) mas[i] = - 30 + rand() % (16 + 30 + 1); printf("%d ", mas[i]); > for (i = N - 1; i >= 0; i--) if (mas[i] % 7 == 0) printf("\n%d", mas[i]); k = 1; break; > > if (k == 0) printf("не найдено"); return EXIT_SUCCESS; >
Break — команда прерывания цикла и выход из него, запуск последующих операторов и инструкций. Алгоритм решения примера несложен.
И последний на сегодня: Заполнить одномерный массив из 20-ти элементов из файла input.txt и вывести его на экран. Изменить элементы массива, умножив четные элементы на 2, а нечетные — на 3. Вывести измененный массив на экран на новой строке.
#include stdio.h> #include stdlib.h> int main(void) FILE*input; input = fopen("input.txt","r"); int mas[20],i; for (i = 1; i = 20; i++) fscanf(input, "%d", & mas[i]); printf("%d ", mas[i]); > printf("\n"); for (i = 1; i = 20; i++) if (mas[i] % 2 == 0) mas[i] *= 2; > else mas[i] *= 3; > printf("%d ", mas[i]); > fclose(input); return EXIT_SUCCESS; >

Ввод/вывод:
Тут тоже ничего особенного, поэтому на этом и закончим.=) Вот и всё. Пишите вопросы, комментируйте, всем ответим. Все исходники без файлов txt.
Скачать исходники задачи — 1
Скачать исходники задачи — 2
Скачать исходники задачи — 3
Скачать исходники задачи — 4
Поделиться ссылкой:
Array.prototype.indexOf()
Метод indexOf() возвращает первый индекс, по которому данный элемент может быть найден в массиве или -1, если такого индекса нет.
Синтаксис
arr.indexOf(searchElement[, fromIndex = 0])
Параметры
Искомый элемент в массиве.
Индекс, с которого начинать поиск. Если индекс больше или равен длине массива, возвращается -1, что означает, что массив даже не просматривается. Если индекс является отрицательным числом, он трактуется как смещение с конца массива. Обратите внимание: если индекс отрицателен, массив всё равно просматривается от начала к концу. Если рассчитанный индекс оказывается меньше 0, поиск ведётся по всему массиву. Значение по умолчанию равно 0, что означает, что просматривается весь массив.
Описание
Метод indexOf() сравнивает искомый элемент searchElement с элементами в массиве, используя строгое сравнение (en-US) (тот же метод используется оператором === , тройное равно).
Примеры
Пример: использование indexOf()
В следующем примере indexOf() используется для поиска значений в массиве.
var array = [2, 5, 9]; array.indexOf(2); // 0 array.indexOf(7); // -1 array.indexOf(9, 2); // 2 array.indexOf(2, -1); // -1 array.indexOf(2, -3); // 0
Пример: нахождение всех вхождений элемента
В следующем примере indexOf() используется для поиска всех индексов элемента в указанном массиве, которые с помощью push() добавляются в другой массив.
var indices = []; var array = ["a", "b", "a", "c", "a", "d"]; var element = "a"; var idx = array.indexOf(element); while (idx != -1) indices.push(idx); idx = array.indexOf(element, idx + 1); > console.log(indices); // [0, 2, 4]
Полифил
Метод indexOf() был добавлен к стандарту ECMA-262 в 5-м издании; поэтому он может отсутствовать в других реализациях стандарта. Вы можете работать с ним, добавив следующий код в начало ваших скриптов, он позволяет использовать indexOf() в реализациях, которые не поддерживают этот метод. Этот алгоритм является точно тем, что описан в ECMA-262 5-го издания; он предполагает, что TypeError и Math.abs() имеют свои первоначальные значения.
// Шаги алгоритма ECMA-262, 5-е издание, 15.4.4.14 // Ссылка (en): http://es5.github.io/#x15.4.4.14 // Ссылка (ru): http://es5.javascript.ru/x15.4.html#x15.4.4.14 if (!Array.prototype.indexOf) Array.prototype.indexOf = function (searchElement, fromIndex) var k; // 1. Положим O равным результату вызова ToObject с передачей ему // значения this в качестве аргумента. if (this == null) throw new TypeError('"this" is null or not defined'); > var O = Object(this); // 2. Положим lenValue равным результату вызова внутреннего метода Get // объекта O с аргументом "length". // 3. Положим len равным ToUint32(lenValue). var len = O.length >>> 0; // 4. Если len равен 0, вернём -1. if (len === 0) return -1; > // 5. Если был передан аргумент fromIndex, положим n равным // ToInteger(fromIndex); иначе положим n равным 0. var n = +fromIndex || 0; if (Math.abs(n) === Infinity) n = 0; > // 6. Если n >= len, вернём -1. if (n >= len) return -1; > // 7. Если n >= 0, положим k равным n. // 8. Иначе, n // Если k меньше нуля 0, положим k равным 0. k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); // 9. Пока k < len, будем повторятьwhile (k len) // a. Положим Pk равным ToString(k). // Это неявное преобразование для левостороннего операнда в операторе in // b. Положим kPresent равным результату вызова внутреннего метода // HasProperty объекта O с аргументом Pk. // Этот шаг может быть объединён с шагом c // c. Если kPresent равен true, выполним // i. Положим elementK равным результату вызова внутреннего метода Get // объекта O с аргументом ToString(k). // ii. Положим same равным результату применения // Алгоритма строгого сравнения на равенство между // searchElement и elementK. // iii. Если same равен true, вернём k. if (k in O && O[k] === searchElement) return k; > k++; > return -1; >; >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-array.prototype.indexof |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Array.prototype.lastIndexOf()
- TypedArray.prototype.indexOf() (en-US)