2013-02-12 4 views
0

J'ai une fonction qui accepte deux vecteurs v1 et v2. Compare les éléments dans les deux et est censé renvoyer les éléments communs des deux. Les deux vecteurs ont 5 chaînes.Quel est le problème avec ma fonction d'intersection vectorielle?

Cela ne fonctionne pas comme prévu, cependant. Par exemple, je saisir pour v1:

dog cat lizard snake pig 

et v2 a:

cat sheep cow snake fish 

Le résultat est que:

snake 

Comment puis-je résoudre ce problème afin que la sortie ressemblerait à quelque chose comme le suivre?

cat snake 

mon code

#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 
const int CAPACITY = 5; 

template <typename t> 
vector <t> inter(const vector <t> & v1, const vector <t> & v2) 
{ 
    vector <t> v3; 
    for(int i = 0; v1.size(); i++) 
    { 
     for(int j= 0; v2.size(); j++) 
     { 
      if (v1[i] == v2[j]) 
      { 
       v3.push_back(v1[i]); 
      } 
     } 
    } 
    return v3; 

} 

int main() 
{ 
    vector<string> vec1; 
    string a; 
    cout << "Enter five stings for vector 1 \n"<< endl; 
    for(int i = 0; i< CAPACITY; i++) 
    { 
     cin >> a; 
     vec1.push_back(a); 
    } 
    vector<string> vec2; 
    string b; 
    cout << "Enter five stings for vector 2 \n"<< endl; 
    for(int i = 0; i< CAPACITY; i++) 
    { 
     cin >> b; 
     vec2.push_back(b); 
    } 

    cout<<inter(vec1, vec2); 
} 

Répondre

5

Une option consiste à trier les deux vecteurs, puis utilisez std::set_intersection.

+0

Je dirais que ce n'est pas seulement * une * option, mais normalement l'option préférée. –

1

Eh bien, votre fonction inter a quelques problèmes:

  • Le type de retour est un seul élément
  • Deux variables locales inutilisées
  • teste que chaque élément contre celui dans la position identique dans la Autre jeu
0

Pour l'inter fonction, changez d'abord le type de retour à un vecteur, puis utilisez le vecteur v3 que vous n'utilisez pas actuellement pour l'opération ci-dessous ns.

vector<t> inter(const vector <t> & v1, const vector <t> & v2) 
{ 
    vector<t> v3; 

    for(int i=0; i<v1.size(); i++) 
    { 
     for(int j=0; j<v2.size(); j++) 
     { 
       if(v1[i] == v2[j]) 
       { 
        v3.push_back(v1[i]) 
       } 
     } 
    } 
    return v3; 
} 

Pour imprimer le contenu que vous devez attribuer le vecteur retourné à une boucle variable, puis à travers comme tel ...

vector<t> vec3 = inter(vec1, vec2); 
for(int i=0; i<vec3.size(); i++) 
{ 
    cout<<vec3.at(i)<<" "; 
} 

qui renverra un vecteur contenant toutes les réponses, assurez-vous de faire les changements à la boucle comme avant que votre boucle ne vérifie que s'ils étaient au même endroit, et non s'ils étaient tous les deux dans le vecteur

Soyez conscient que cela produira des résultats en double dans le cas de {x , x, y} et {x, z, a}

+0

Quand je reviens v3 il jette l'erreur. erreur: impossible de convertir 'v3' à partir de 'std :: vector >' à 'std :: basic_string ' | – user1721532

+0

Votre définition de fonction initiale devrait ressembler à ceci vecteur inter (... Veillez à définir v3 en tant que vecteur afin qu'il corresponde correctement à votre modèle, car l'erreur semble ne pas avoir modifié le type de retour pour votre fonction. – MCWhitaker

+0

J'ai modifié ma réponse originale pour la rendre plus claire. – MCWhitaker

2

Utilisez l'algorithme std::set_intersection est beaucoup plus facile, il nécessite deux vecteurs: triés

template <typename T> 
std::vector<T> inter(const std::vector<T> & v1, const std::vector<T> & v2) 
{ 
    std::vector<T> v3; 
    std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v3)); 
    return v3; 
} 

std::sort(vec1.begin(), vec1.end()); // sort vec1 
std::sort(vec2.begin(), vec2.end()); // sort vec2 
std::vector<std::string> v3 = inter(vec1, vec2); 

Voir sample Code

Questions connexes