Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的泛型函数+;用于删除重复项_C++_Arrays_Templates - Fatal编程技术网

C++ C+中的泛型函数+;用于删除重复项

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

我必须创建一个泛型函数来删除向量中的所有重复项,向量书是我创建的一个类,它有getYear和getName函数。我不知道该如何使函数更简单,因为向量是比较的,因为这本书与getName和getYear进行了比较。Int在一个级别上进行比较,而Book在两个级别上进行比较

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)
来生成两本书的词典顺序。