1

我必须创建一个通用函数来删除 vectorInt 中的所有重复项,这是我创建的具有 getYear 和 getName 函数的类。我不确定如何制作该函数,因为比较了vectorInt,因为Book 与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;
}

谢谢您的帮助

编辑:

试过用这个

 template <class T> std::vector<T> removeDuplicates(std::vector<T> vec)
 {
 std::sort( vec.begin(), vec.end() );
 vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() );
 return vec;
 }

但是对于书籍,我不断收到错误

class Book { 
public:
Book();
Book(std::string, int);
int getYear() const {
return year;
 }
std::string getName() const {
return name;
}
bool operator==(Book const &);

  private:
  std::string name;
  int year;
};
4

2 回答 2

5

纯 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;
}

您可以通过获取和返回参考而不是副本来提高效率。

代码无耻地从这个问题的答案中获取了信息。

于 2012-10-03T18:46:08.490 回答
2

只要Book有一个可用的operator ==实现,这应该可以正常工作。如果没有,那么您将需要为这样的运算符创建一个特化Book或添加这样的运算符:

class Book
{
    // ...
public:
    bool operator==(Book const &);
};

bool Book::operator==(Book const & other)
{
    return getName() == other.getName() && getYear() == other.getYear();
}

请注意,您的遍历中有一个错误 - 如果您最终删除了一个项目,则将跳过下一个项目。考虑改用这个循环:

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;
        }
    }
}
于 2012-10-03T18:41:26.357 回答