Hash -Tabellen und 2D -Vektoren
-
15-10-2019 - |
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;
}
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::vector
Konstruktoren 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));