À l'aide d'une fonction pour supprimer les doublons d'un tableau en C++
Je suis en train d'écrire un programme qui a une entrée de l'utilisateur entiers dans un tableau, appelle une fonction qui supprime les doublons à partir de ce tableau, puis imprime le tableau modifié. Quand je le lance, il me permet de valeurs d'entrée dans le tableau, mais alors donne moi un "Segmentation fault" message d'erreur lorsque j'ai terminé l'entrée des valeurs. Ce que je fais mal?
Voici mon code:
#include <iostream>
using namespace std;
void rmDup(int array[], int& size)
{
for (int i = 0; i < size; i++)
{
for (int j = i + 1; j < size; j++)
{
if (array[i] == array[j])
{
array[i - 1 ] = array[i];
size--;
}
}
}
}
int main()
{
const int CAPACITY = 100;
int values[CAPACITY], currentSize = 0, input;
cout << "Please enter a series of up to 100 integers. Press 'q' to quit. ";
while (cin >> input)
{
if (currentSize < CAPACITY)
{
values[currentSize] = input;
currentSize++;
}
}
rmDup(values, currentSize);
for (int k = 0; k < currentSize; k++)
{
cout << values[k];
}
return 0;
}
Merci.
Pour c++ pensez à utiliser
Pourquoi ne pas utiliser la Bibliothèque Standard?
Je ne connais pas ces commandes (tri, à la fin, unique), mais je vais certainement se familiariser avec eux.
pensez à la limite de la ligne de cas ( general technic lorsque vous traitez avec des tableaux ). Lorsque i = taille - 1 , j deviendra taille . Il mneans tableau[j], tableau[taille] . Cela signifie que crash:)
std::vector<int>
au lieu de int array[]
Pourquoi ne pas utiliser la Bibliothèque Standard?
using namespace std; sort(begin(values), end(values)); size = unique(begin(values), end(values)) - begin(values);
Je ne connais pas ces commandes (tri, à la fin, unique), mais je vais certainement se familiariser avec eux.
pensez à la limite de la ligne de cas ( general technic lorsque vous traitez avec des tableaux ). Lorsque i = taille - 1 , j deviendra taille . Il mneans tableau[j], tableau[taille] . Cela signifie que crash:)
OriginalL'auteur Carlos | 2013-12-10
Vous devez vous connecter pour publier un commentaire.
Si
array[0]
etarray[1]
sont égaux,array[0-1] = array[0]
, ce qui signifie quearray[-1] = array[0]
. Vous n'êtes pas censé l'accèsarray[-1]
.Ces commentaires m'a mis sur la bonne voie je pense. Je suis étonné de la rapidité de cette communauté répond. Je vous remercie.
OriginalL'auteur Silent Control
Je ne voudrais pas le faire même possible de créer des doublons:
Et faites-vous une faveur et ne pas utiliser des tableaux. Découvrez la STL.
Vous créez pas de tableaux en double, mais les valeurs en double dans un tableau.
std::set
"empêche".OK. L'a obtenu. Merci.
OriginalL'auteur Sceptical Jule
Ce code compile en C++11.
vec.erase(unique(begin(vec), end(vec)), end(vec));
, et aussi qui se débarrasse de la boucle.for_each(vec.begin(),vec.end(),[](const int elem){cout << elem;});
Alternativement avec une gamme à base de:for(auto const& e : vec) std::cout<<e<<", ";
Lorsque vous utilisez
vec.erase(it)
, vous invaliderit
. Je ne sais pas si on peut comparer un invalide itérateur contre la fin itérateur (dans la prochaine itération de boucle).À l'aide de
std::vector
pour l'effacement est cher parce que tous les éléments suivants doivent être re-alocated après chaque effacer() de l'appel.std::list
avec la constante de temps d'effacement doit être préférée dans ce cas.Je n'ai pas commencé à l'aide de vecteurs encore, mais. Je vous remercie pour l'aide.
OriginalL'auteur lucas92
OriginalL'auteur sanjeev