Я получаю ошибку сегментации при обращении векторов без использования STL - PullRequest
0 голосов
/ 21 апреля 2020

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

#include <bits/stdc++.h>
    using namespace std;


    vector<int> reversearray(vector<int> a,int n)
    {
        int low=0, high=n-1;

        while(low<high)
        {
            swap(a[low],a[high]);
            low++;
            high--;
        }

        return a;


    }
    int main() {

        int t,n;
        vector<int> v,ans;
        cin>>t;
        while(t--)
        {
            cin>>n;

            for(int i=0;i<n;i++){
                cin>>v[i];
            }

            ans=reversearray(v,n);
            for(int i=0;i<n;i++)
                cout<<ans[i]<<" ";
            //Simple solution would be to iterate in reverse order
            /*for(int i=n-1;i>=0;i--){
                cout<<v[i]<<" ";
            }*/
           cout<<"\n";
        }
        return 0;
    }

1 Ответ

1 голос
/ 21 апреля 2020

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

Вы не можете напрямую сканировать на входе значение v[i], поскольку размер вектора v изначально равен 0 .

Вместо этого используйте метод push_back() или инициализируйте или измените размер вектора до размера n.

Посмотрите на следующую реализацию:

#include <iostream>
#include <vector>

std::vector<int> reversearray(std::vector<int> a,int n)
{
    int low=0, high=n-1;

    while(low<high)
    {
        std::swap(a[low],a[high]);
        low++;
        high--;a
    }

    return a;


}

int main() {

    int t,n;
    std::vector<int> v,ans;
    std::cin>>t;
    while(t--)
    {
        std::cin>>n;

        for(int i=0;i<n;i++){
            int x;
            std::cin>>x;
            v.push_back(x);
        }

        ans=reversearray(v,n);
        for(int i=0;i<n;i++)
            std::cout<<ans[i]<<" ";

        //Simple solution would be to iterate in reverse order
        /*for(int i=n-1;i>=0;i--){
            cout<<v[i]<<" ";
        }*/

        std::cout<<"\n";

        v.clear();
    }
    return 0;
}

GFG Вердикт:

enter image description here

Если вы хотите использовать v[i]:

#include <iostream>
#include <vector>

std::vector<int> reversearray(std::vector<int> a,int n)
{
    int low=0, high=n-1;

    while(low<high)
    {
        std::swap(a[low],a[high]);
        low++;
        high--;
    }

    return a;


}

int main() {

    int t,n;
    std::vector<int> v,ans;
    std::cin>>t;
    while(t--)
    {
        std::cin>>n;

        v.resize(n);

        for(int i=0;i<n;i++){
            std::cin>>v[i];
        }

        ans=reversearray(v,n);
        for(int i=0;i<n;i++)
            std::cout<<ans[i]<<" ";

        //Simple solution would be to iterate in reverse order
        /*for(int i=n-1;i>=0;i--){
            cout<<v[i]<<" ";
        }*/

        std::cout<<"\n";
    }
    return 0;
}

enter image description here

PS: Я бы посоветовал не использовать бит / stdc ++. H и с использованием пространства имен std . Вы можете узнать причину.

...