Frage

Ich möchte einen 2D -Vektor in eine Hash -Tabellenzeile nach Zeile drücken und später nach einer Zeile (Vektor) in der Hash -Tabelle suchen und möchten sie finden können. Ich möchte so etwas tun

#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;
}

Ich bin mir nicht sicher, wie ich einen Vektor in einem Satz einfügen und nachschlagen soll. Wenn NYBODY mich also führen könnte, wird es hilfreich sein. Vielen Dank

aktualisieren:

Wie mir klar wurde std::set ist keine Hash -Tabelle, die ich verwendet habe, um sie zu verwenden unordered_map Aber wie soll ich in diesem Sinne einfügen und finden:

#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;
}
War es hilfreich?

Lösung

Zum Einsetzen der Verwendung std::set::insert, ala

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

zum Finden, verwenden Sie std::set::find Ala

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

Arbeitsbeispiel:

#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;
}

Andere Tipps

Benutzen std::copy in einen Satz einfügen:

#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));

Sie können auch verwenden std::vectorKonstruktoren zuweisen, einfügen oder kopieren, um dasselbe zu tun.

Sie verwenden a std::set In diesem Beispiel. Ein Set hat keine Suchmethode. Sie iterieren einfach das Set, der Operationen für jeden Artikel durchführt. Wenn Sie mithilfe eines Hash/Schlüssels nach bestimmten Elementen nachschlagen möchten, sollten Sie sich Datenstrukturen wie untersuchen 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 ?
}

Es ist nicht korrekt, weil Sie versuchen, Ganzzahlen von jedem Vektor in Ihrem Vektor von Vektoren in den Satz zu kopieren. Ihre Absicht und der Typ Ihres Satzes geben an, dass die 5 Vektoren in Ihren Satz eingefügt werden sollen. Sie würden dies dann einfach tun (Nein für Schleife):

std::copy(v.begin(), v.end(), std::inserter(myset));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top