Векторное сравнение итератора - PullRequest
2 голосов
/ 12 марта 2012

У меня проблема при сравнении значений в двух векторах.

Ниже приведен пример кода моей программы:

  template <typename T> bool CompareVectors(std::vector<T> vector1, std::vector<T> vector2)
  {
    std::sort(vector1.begin(),vector1.end());
    std::sort(vector2.begin(),vector2.end());
    if (vector1.size() != vector2.size())
      return false;
    else
    {
      bool found = false;
      std::vector<T>::iterator it;
      std::vector<T>::iterator it2;
      for (it = vector1.begin();it != vector1.end(); it++)
      {      
        for(it2 = vector2.begin(); it2 != vector2.end(); it2++)
        {
          if(it == it2) // here i have to check the values in the itearators are equal.
          {
            found = true;
            break;
          }
        }
        if(!found)
          return false;
        else
          found = false;
      }
      return true;  
    }
    };

В этом примере кода мне необходимо сравнить два вектора,Для этого я отсортировал два вектора, используя std::sort().Поскольку тип данных в векторе является шаблоном (я использую объект класса в векторе), std::sort() не работает должным образом.Т.е. иногда после сортировки два вектора дают различный порядок элементов.

Поэтому я не могу использовать также функцию std::equal().

Для альтернативного решения я использовал два итераторадля тви векторов.

Итерирование одного вектора и поиск этого элемента в другом векторе.Для этого сравнение итератора не может быть использовано.

Ответы [ 3 ]

3 голосов
/ 12 марта 2012

Сначала вы должны использовать ключевое слово typename здесь:

typename std::vector<T>::iterator it;
typename std::vector<T>::iterator it2;

без typename ваш код даже не скомпилируется.

Для сравнения значений на что указывают итераторы, вы должны сделать это:

if( *it == *it2)

Вы можете написать функцию сравнения как:

//changed the name from CompareVectors() to equal()
template <typename T> 
bool equal(std::vector<T> v1, std::vector<T> v2)
{
  std::sort(v1.begin(),v1.end());
  std::sort(v2.begin(),v2.end());
  if ( v1.size() != v2.size() )
       return false;
  return std::equal(v1.begin(),v1.end(), v2.begin());
};
0 голосов
/ 12 марта 2012

Здесь есть несколько проблем.Во-первых, вы говорите, что std::sort() не работает.Вы перегрузили operator< для своего класса?

Кроме того, вам нужно сравнить, что итераторы указывают на:

*it == *it2

Далее вам необходимоитерация по обоим массивам одновременно (всего один цикл):

for (it = vector1.begin(), it2 = vector2.begin();
     it != vector1.end(), it2 != vector2.end();
     it++, it2++) {
  ...
}

Хотя на самом деле вам следует просто использовать std::equal(), перегружая operator==.

И из эффективностиС точки зрения, вы должны сравнить size() значения до того, как потрудитесь отсортировать массивы.

0 голосов
/ 12 марта 2012

Если эта строка:

if(it == it2)

быть

if (*it == *it2)

Первая строка сравнивает указатели, а не значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...