Я пытаюсь сделать функцию вне main в С++ для поиска, существует ли элемент внутри массива, если да, то функция должна хранить индексы/местоположения этого элемента в этом массиве в другом массиве с именем index.

Проблема в том, что когда я пытаюсь использовать одинаковый размер для обоих массивов, функция поиска сообщает об ошибке, где переменная размера должна быть постоянным значением, поэтому я попытался, и это мой код.

#include <iostream>
using namespace std;

int searchForElement(int[], int const, int);

int main()
{
    int array[5];
    for (int i = 0; i < 5; i++)
        array[i] = i * 2;
    
    searchForElement(array, 5, 6);

    return 0;
}

int searchForElement(int a[], int const n, int x) {
    int index[n];
    int ii = 0; //counter for index array
    
    for (int i = 0; i < n; i++) {
        if (a[i] == x){
            index[ii] = i;
            ii++;
        }
    }
    return index[n];
}

Код серьезности Описание Состояние подавления строки файла проекта Ошибка (активно) Выражение E0028 должно иметь постоянное значение ConsoleApplication1 C:...\repos\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.cpp 45

как я могу сделать индексный массив того же размера, что и любой заданный массив для этой функции?

0
stone test 26 Янв 2022 в 12:49
Где вы инициализируете массив index?
 – 
SoulKa
26 Янв 2022 в 12:53
Вы хотите вернуть массив index? Вы, наверное, знаете, что необработанные массивы так возвращать нельзя.
 – 
digito_evo
26 Янв 2022 в 12:54
О, вы хотите создать новый динамический массив? Затем инициализируйте массив index с помощью int* index = new int[n];. Перед выходом из вызова функции delete[] index;
 – 
SoulKa
26 Янв 2022 в 12:54
1
Вы можете сделать std::vector<int> index(n);
 – 
BoP
26 Янв 2022 в 12:55

2 ответа

как я могу сделать индексный массив того же размера, что и любой заданный массив для этой функции?

Вариант 1. Замените функцию шаблоном функции и сделайте размер массива параметром шаблона. Параметры шаблона являются константами времени компиляции.

Вариант 2: Создайте динамический массив. Удобнее всего использовать std::vector.

Вариант 3: не создавайте массив в searchForElement. Вызывающий знает, какой большой массив ему нужен, поэтому вы можете позволить ему передать его в функцию точно так же, как он передал массив поиска.


return index[n];

Во-первых, индекс n окажется за пределами массива, поэтому поведение программы будет неопределенным. Во-вторых, если вы намерены искать все индексы, то возвращение одного из индексов, вероятно, не то, что вы пытались сделать.

0
eerorika 26 Янв 2022 в 13:05

Разве вы не хотите облегчить себе работу, воспользовавшись некоторыми современными функциями?

Проверьте это (требуется С++ 20):

#include <iostream>
#include <vector>
#include <span>


std::vector< std::size_t > searchForElement( const std::span<const int> array, const int key )
{
    std::vector< std::size_t > indices;
    indices.reserve( array.size( ) );
    
    for ( std::size_t idx { }; idx < array.size( ); ++idx )
    {
        if ( array[idx] == key )
        {
            indices.push_back( idx );
        }
    }

    indices.shrink_to_fit( );

    return indices;
}

int main( )
{
    std::array<int, 5> array;

    for ( std::size_t idx { }; idx < std::size( array ); ++idx )
        array[ idx ] = idx * 2;

    std::vector< std::size_t > indices { searchForElement( array, 6 ) };

    std::cout << "The given 'key' was found in indices:\n";

    for ( const auto index : indices )
    {
        std::cout << index << ' ';
    }
}

Резюме:

  1. Используйте контейнеры STL, такие как std::array.
  2. Вернуть std::vector, содержащий индексы.
  3. Используйте std::span вместо массива указатель + размер. Таким образом, вы можете передать ему std::vector, std::array, необработанный массив и т. д.
0
digito_evo 26 Янв 2022 в 13:22