2
votes

y a-t-il un autre moyen de remplir un tableau en C ++ sans vecteur

J'ai donc les tableaux A et B, deux d'entre eux contiennent des nombres aléatoires et je dois écrire dans le tableau C initialement des nombres pairs de A et B, puis impairs. J'ai créé ce vecteur avec un vecteur mais je me demande s'il existe une autre façon de le faire, comme en Javascript, il existe des méthodes comme .unshift (), .push () etc.

#include<iostream>
#include<vector>
using namespace std;

int main() {
    const int n = 4;
    int A[n];
    int B[n];
    vector<int>C;
    for (int i = 0; i < n; i++)
    {
        A[i] = rand() % 10;
        cout << A[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < n; i++)
    {
        B[i] = rand() % 30;
        cout << B[i] << " ";
    }
    for (int i = 0; i < n; i += 1)
    {
        if (A[i] % 2 == 0)
        {
            C.push_back(A[i]);
        }
        if (B[i] % 2 == 0)
        {
            C.push_back(B[i]);
        }
    }
    for (int i = 0; i < n; i++)
    {
        if (A[i] % 2 != 0)
        {
            C.push_back(A[i]);
        }
        if (B[i] % 2 != 0)
        {
            C.push_back(B[i]);
        }
    }
    cout << endl;
    for (int i = 0; i < C.size(); i++)
        cout << C[i] << " ";
}


2 commentaires

Ces fonctions Javascript comme unshift , push et autres font: devinez quoi? Ils fonctionnent sur ce qu'on appellerait un std::vector en C ++. Ce que Javascript appelle «tableau», en C ++, c'est un «vecteur». Même chose exactement. Javascript n'est pas C ++. C ++ n'est pas Javascript. Aucune loi n'oblige tous les langages de programmation à utiliser le même nom pour des concepts équivalents.


Vous pouvez également consulter l'échange de pile de «révision du code» pour obtenir des commentaires plus critiques sur votre code et vos techniques. Par exemple, utilisez range-for, ne dites pas "en utilisant l'espace de noms", utilisez des algorithmes standard plutôt que d'écrire des boucles explicites, ...


4 Réponses :


1
votes

vector::push_back est le moyen le plus simple d'avoir une collection qui s'agrandit au fur et à mesure que vous ajoutez des éléments à la fin.

Puisque vous avez une taille fixe pour A et B, vous pouvez en faire des tableaux primitifs à la place, ce que vous avez fait. Mais pour C, vous ne savez pas combien de temps cela durera, donc une collection qui a une taille variable est appropriée.


0 commentaires

1
votes

Vous pouvez utiliser std::array , si vous connaissez la taille dont vous avez besoin au moment de la compilation. Vous pouvez ensuite ajouter à l'aide d'un itérateur.

#include<vector>
using namespace std;

int main() {
    const int n = 4;
    int A[n];
    int B[n];
    std::array<int, n+n>C;  // <-- here
    auto C_it = C.begin();  // <-- here

    for (int i = 0; i < n; i++)
    {
        A[i] = rand() % 10;
        cout << A[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < n; i++)
    {
        B[i] = rand() % 30;
        cout << B[i] << " ";
    }
    for (int i = 0; i < n; i += 1)
    {
        if (A[i] % 2 == 0)
        {
            *C_it++ = A[i]; // <-- here
        }
        if (B[i] % 2 == 0)
        {
            *C_it++ = B[i];
        }
    }
    for (int i = 0; i < n; i++)
    {
        if (A[i] % 2 != 0)
        {
            *C_it++ = A[i];
        }
        if (B[i] % 2 != 0)
        {
            *C_it++ = B[i];
        }
    }
    cout << endl;
    for (int i = 0; i < C.size(); i++)
        cout << C[i] << " ";
}

Alternativement, si vous voulez être plus sûr, vous pouvez conserver l'index non écrit suivant et accéder aux éléments avec C.at(last++) = A[i] , qui vérifie les hors limites et lève une exception au lieu de UB.


0 commentaires

5
votes

Je suggérerais d'entrelacer A et B départ:

std::stable_partition(C.begin(), C.end(), [](int i) { return i % 2 == 0; });

Et puis partitionner C en éléments pairs et impairs:

for (int i = 0; i < n; i += 1)
{
    C.push_back(A[i]);
    C.push_back(B[i]);
}


1 commentaires

cigien une fois de plus avec la sagesse de la STL.



0
votes

Eh bien, vous ne changez pas grand-chose.

premier de déclarer le tableau C comme int C[n+n]; et déclarez une variable pour incrémenter via le tableau c comme int j=0;

et en if les instructions de boucles font ceci C[j]=A[i]; j++; pour le premier si et C[j]=B[i]; j++; pour la seconde instruction if

int main() {
    const int n = 4;
    int A[n];
    int B[n];
    int C[n+n];
    int j=0;
    for (int i = 0; i < n; i++)
    {
        A[i] = rand() % 10;
        cout << A[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < n; i++)
    {
        B[i] = rand() % 30;
        cout << B[i] << " ";
    }
    for (int i = 0; i < n; i += 1)
    {
        if (A[i] % 2 == 0)
        {
            C[j]=A[i];
            j++;
        }
        if(B[i]%2==0){
            C[j]=B[i];
            j++;
        }
        
    }
    for (int i = 0; i < n; i++)
    {
        if (A[i] % 2 != 0)
        {
            C[j]=A[i];
            j++;
        }
        if (B[i] % 2 != 0)
        {
            C[j]=B[i];
            j++;
        }
    }
    j=0;
    cout << endl;
    for (int i = 0; i < C[].lenght(); i++)
        cout << C[i] << " ";
}


0 commentaires