C++ C+中的泛型函数+;用于删除重复项
我必须创建一个泛型函数来删除向量中的所有重复项,向量书是我创建的一个类,它有getYear和getName函数。我不知道该如何使函数更简单,因为向量是比较的,因为这本书与getName和getYear进行了比较。Int在一个级别上进行比较,而Book在两个级别上进行比较C++ C+中的泛型函数+;用于删除重复项,c++,arrays,templates,C++,Arrays,Templates,我必须创建一个泛型函数来删除向量中的所有重复项,向量书是我创建的一个类,它有getYear和getName函数。我不知道该如何使函数更简单,因为向量是比较的,因为这本书与getName和getYear进行了比较。Int在一个级别上进行比较,而Book在两个级别上进行比较 template<class T> vector<T> removeDuplicates(vector<T> n){ for(unsigned int i = 0; i < n.size
template<class T> vector<T> removeDuplicates(vector<T> n){
for(unsigned int i = 0; i < n.size();i++){
T current = n.at(i);
for(unsigned int j = i + 1; j < n.size(); j++){
T compare = n.at(j);
if(current == compare)
n.erase(n.begin() + j);
}
}
return n;
}
只要
Book
有一个可用的operator==
实现,它就可以正常工作。如果没有,则需要为Book
创建专门化,或添加这样的操作符:
class Book
{
// ...
public:
bool operator==(Book const &);
};
bool Book::operator==(Book const & other)
{
return getName() == other.getName() && getYear() == other.getYear();
}
请注意,在遍历过程中有一个off-by-one错误——如果最终删除了一个项,则将跳过下一个项。考虑使用这个循环代替:
for (vector<T>::iterator i = n.begin; i != n.end(); ++i) {
for (vector<T>::iterator j = i + 1; j != n.end(); /* */) {
if (*i == *j) {
n.erase(j++);
} else {
++j;
}
}
}
for(向量::迭代器i=n.begin;i!=n.end();++i){
对于(向量::迭代器j=i+1;j!=n.end();/**/){
如果(*i==*j){
n、 擦除(j++);
}否则{
++j;
}
}
}
只要Book
有一个可用的操作符==
实现,这应该可以正常工作。如果没有,则需要为Book
创建专门化,或添加这样的操作符:
class Book
{
// ...
public:
bool operator==(Book const &);
};
bool Book::operator==(Book const & other)
{
return getName() == other.getName() && getYear() == other.getYear();
}
请注意,在遍历过程中有一个off-by-one错误——如果最终删除了一个项,则将跳过下一个项。考虑使用这个循环代替:
for (vector<T>::iterator i = n.begin; i != n.end(); ++i) {
for (vector<T>::iterator j = i + 1; j != n.end(); /* */) {
if (*i == *j) {
n.erase(j++);
} else {
++j;
}
}
}
for(向量::迭代器i=n.begin;i!=n.end();++i){
对于(向量::迭代器j=i+1;j!=n.end();/**/){
如果(*i==*j){
n、 擦除(j++);
}否则{
++j;
}
}
}
纯STL版本:
#include <algorithm>
template <class T> std::vector<T> removeDuplicates(std::vector<T> vec)
{
std::sort( vec.begin(), vec.end() );
std::vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() );
return vec;
}
#包括纯STL版本:
#include <algorithm>
template <class T> std::vector<T> removeDuplicates(std::vector<T> vec)
{
std::sort( vec.begin(), vec.end() );
std::vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() );
return vec;
}
#include注意,此技术将对向量内容重新排序。这可能重要,也可能不重要。然而,你可能可以从链接的问题中找出一些不涉及重新排序的问题。这对int有效,但当我尝试使用Book时,我总是得到一个错误,将其发布在问题中。很可能您缺少一个比较运算符,可能是==或者请注意,此技术将对向量内容重新排序。这可能重要,也可能不重要。然而,你可能可以从链接的问题中找出一些不涉及重新排序的问题。这对int有效,但当我尝试使用Book时,我总是得到一个错误,将其发布在问题中。很可能您缺少比较运算符,可能==或者为了能够对书籍进行排序,您需要在书籍上定义严格的弱顺序,并告诉std::sort()
。最简单的方法是启用book1
,例如,通过实现小于运算符bool运算符(Book const&b0,Book const&b1)
来生成两本书的字典顺序。要能够对书进行排序,需要在书上定义严格的弱顺序,并告诉std::sort()
关于此订单。最简单的方法是启用book1
,例如,通过实现小于运算符bool运算符<(Book const&b0,Book const&b1)
来生成两本书的词典顺序。