我必须创建一个泛型函数,它将vectorInt中的所有重复项移除一个vectorBook,它是我创建的具有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;
};
答案 0 :(得分: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;
}
您可以通过获取和返回引用而不是副本来提高效率。
<子> Code snarfed shamelessly from answer to this question. 子>
答案 1 :(得分: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;
}
}
}