我在比较两个向量中的值时遇到了问题。
以下是我的程序的示例代码:
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向量使用了两个迭代器。
迭代一个向量并在另一个向量中搜索该元素。为此,迭代器比较无法使用。
答案 0 :(得分: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());
};
答案 1 :(得分:0)
这一行:
if(it == it2)
是
if (*it == *it2)
第一行是比较指针而不是值。
答案 2 :(得分:0)
这里有很多问题。首先,你说std::sort()
不起作用。你为班上的operator<
超载了吗?
此外,您需要比较指向的迭代器:
*it == *it2
此外,您需要同时迭代两个数组(只需一个循环):
for (it = vector1.begin(), it2 = vector2.begin();
it != vector1.end(), it2 != vector2.end();
it++, it2++) {
...
}
尽管如此,您应该通过重载std::equal()
来使用operator==
。
从效率的角度来看,你应该在之前比较<{1}}值,这样你就不必对数组进行排序了。