хеш-таблицы и 2d векторы - PullRequest
0 голосов
/ 04 января 2011

Я хочу вставить 2d вектор в хэш-таблицу строка за строкой, а затем искать строку (вектор) в хэш-таблице и хочу, чтобы ее можно было найти.Я хочу сделать что-то вроде

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

Я не уверен, как вставить и найти вектор в наборе.Так что, если никто не сможет направить меня, это будет полезно.Спасибо

обновление:

, как я понял std::set - это не хеш-таблица, я решил использовать unordered_map, но как мне вставить и найти элементы в этом:

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

Ответы [ 3 ]

1 голос
/ 04 января 2011

Для вставки используйте std::set::insert, ala

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

для поиска, используйте std::set::find ala

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

Рабочий пример:

#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;
}
0 голосов
/ 04 января 2011
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 ?
}

Это не правильно, потому что вы пытаетесь скопировать целые числа из каждого вектора вашего вектора векторов в набор. Ваше намерение и тип вашего набора указывают, что вы хотите, чтобы 5 векторов были вставлены в ваш набор. Затем вы просто сделаете это (нет для цикла):

std::copy(v.begin(), v.end(), std::inserter(myset));
0 голосов
/ 04 января 2011

Использовать std::copy для вставки в набор:

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

Вы также можете использовать конструкторы присваивания, вставки или копирования std::vector, чтобы сделать то же самое.

В этом примере вы используете std::set. Набор не имеет метода поиска. Вы просто перебираете множество, выполняя операции над каждым элементом. Если вы хотите искать определенные элементы, используя хеш / ключ, вам нужно посмотреть на структуры данных, такие как std::map.

...