向量迭代器比较

4
我在比较两个向量中的值时遇到了问题。
以下是我的程序示例代码:
  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()函数。
作为一种替代方案,我使用了两个向量的迭代器。
并且迭代一个向量并在另一个向量中查找该元素。由于迭代器比较不能使用,因此需要寻找其他方法。

你是如何实现排序的operator<的?问题可能出在这里...我打赌你有一个指针向量,而你的项目按其地址而不是值进行排序。 - J.N.
你是否为你正在使用的类定义了 <== 运算符? - howard
是的,我已经为我正在使用的类定义了“==”,“<”和“!=”运算符。是的...我在向量中使用指针元素进行比较。这就是std::sorting存在问题的原因。所以它是按地址排序的。 - Aneesh Narayanan
3个回答

3

首先,您需要在此处使用 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());
};

你可以直接使用 return v1 == v2;,而不是先测试大小再调用 std::equal - Blastfurnace
@Blastfurnace:很好。我不知道存在==非成员函数来测试两个向量的相等性。 - Nawaz

1

这一行应该是:

if(it == it2)

if (*it == *it2)

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


0

这里有多个问题。首先,你说 std::sort() 不起作用。你是否为你的类重载了 operator<

此外,你需要比较迭代器所指向的内容:

*it == *it2

此外,您需要同时遍历这两个数组(只需一个循环):
for (it = vector1.begin(), it2 = vector2.begin();
     it != vector1.end(), it2 != vector2.end();
     it++, it2++) {
  ...
}

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

从效率的角度考虑,在排序数组之前,你应该比较size()值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接