Question

Je veux pousser un vecteur 2d dans une ligne de table de hachage par ligne et rechercher plus tard pour une ligne (vecteur) dans la table de hachage et que vous voulez être capable de le trouver. Je veux faire quelque chose comme

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

int main(){

std::set < vector<int> > myset;

vector< vector<int> > v;

int k = 0;

for ( int i = 0; i < 5; i++ ) {
 v.push_back ( vector<int>() );

for ( int j = 0; j < 5; j++ )
 v[i].push_back ( k++ );
}

for ( int i = 0; i < 5; i++ ) {
  std::copy(v[i].begin(),v[i].end(),std::inserter(myset)); // This is not correct but what is the right way ?

// and also here, I want to search for a particular vector if it exists in the table. for ex. myset.find(v[2].begin(),v[2].end()); i.e if this vector exists in the hash table ?

}

  return 0;
}

Je ne sais pas comment insérer et rechercher un vecteur dans un ensemble. Donc, si nybody pouvait me guider, il sera utile. Merci

Mise à jour:

comme je l'ai réalisé std::set n'est pas une table de hachage j'ai décidé d'utiliser unordered_map mais comment dois-je aller sur l'insertion et de trouver des éléments dans ceci:

#include <iostream>
#include <tr1/unordered_set>
#include <iterator>
#include <vector>
using namespace std;

typedef std::tr1::unordered_set < vector<int> > myset;

int main(){
myset c1;
vector< vector<int> > v;

int k = 0;

for ( int i = 0; i < 5; i++ ) {
 v.push_back ( vector<int>() );

for ( int j = 0; j < 5; j++ )
 v[i].push_back ( k++ );
}

for ( int i = 0; i < 5; i++ )  
 c1.insert(v[i].begin(),v[i].end()); // what is the right way? I want to insert vector by vector. Can I use back_inserter in some way to do this?

// how to find the vectors back?

  return 0;
}
Était-ce utile?

La solution

Pour insérer une utilisation std::set::insert, ala

myset.insert(v.begin(), v.end());

pour trouver, utiliser std::set::find ala

std::set < vector<int> >::iterator it = myset.find(v[1]);

Exemple de travail:

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

int main()
{
  typedef vector<int> int_v_t;
  typedef set<int_v_t> set_t;

  set_t myset;

  // this creates 5 items 
  typedef vector<int_v_t> vec_t;
  vec_t v(5);

  int k = 0;

  for(vec_t::iterator it(v.begin()), end(v.end()); it != end; ++it)
  {
   for (int j = 0; j < 5; j++)
    it->push_back(k++);
  }

  // this inserts an entry per vector into the set 
  myset.insert(v.begin(), v.end());

  // find a specific vector
  set_t::iterator it = myset.find(v[1]);

  if (it != myset.end()) cout << "found!" << endl; 

  return 0;
}

Autres conseils

Pour utiliser std::copy à insérer dans un ensemble:

#include <algorithm>
#include <iterator>
#include <vector>

std::vector<int> v1;
// Fill in v1 here
std::vector<int> v2;
std::copy(v1.begin(), v1.end(), std::back_inserter<std::vector<int> >(v2));

Vous pouvez également utiliser assign de std::vector, insérer ou copier les constructeurs à faire de même.

Vous utilisez un std::set dans cet exemple. Un ensemble ne dispose pas d'une méthode de recherche. Vous parcourons simplement l'ensemble des opérations faisant sur chaque point. Si vous souhaitez rechercher des éléments spécifiques à l'aide d'un hachage / clé, vous aurez envie de regarder des structures de données comme std::map.

for ( int i = 0; i < 5; i++ ) {
  std::copy(v[i].begin(),v[i].end(),std::inserter(myset)); // This is not correct but what is the right way ?
}

Il est pas correct parce que vous essayez de copier des nombres entiers de chaque vecteur dans votre vecteur de vecteurs dans l'ensemble. Votre intention, et le type de votre ensemble, indiquent que vous voulez que les 5 vecteurs à insérer dans votre jeu. Vous pouvez ensuite faire simplement ce (pas pour la boucle):

std::copy(v.begin(), v.end(), std::inserter(myset));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top