矢量迭代器比较

Vector iterator comparison

本文关键字:比较 迭代器      更新时间:2023-10-16

在比较两个向量中的值时遇到问题。

以下是我的程序示例代码:

  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()函数。

对于另一种解决方案,我为twi向量使用了两个迭代器。

迭代一个向量并在另一个向量中搜索该元素。为此,迭代器比较是不可用的。

首先必须在此处使用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());
};

此行是否应该:

if(it == it2)

if (*it == *it2)

第一行是比较指针而不是值。

这里有多个问题。首先,你说std::sort()不起作用。你班的operator<超载了吗?

此外,您需要比较指向的迭代器是什么:

*it == *it2

此外,您需要同时遍历两个数组(仅一个循环):

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

实际上,您应该通过重载operator==来使用std::equal()

从效率的角度来看,在对数组进行排序之前,您应该先比较size()