请不要介意没有插入 fnc 并且数据是硬编码的。它的主要目的是为这个容器正确实现迭代器。
//file Set.h
#pragma once
template<class T>
class Set
{
template<class T>
friend ostream& operator<<(ostream& out, const Set<T>& obj);
private:
T** myData_;
std::size_t mySize_;
std::size_t myIndex_;
public:
Set();
class iterator : public std::iterator<std::random_access_iterator_tag, T*>
{
private:
T** itData_;
public:
iterator(T** obj)
{
itData_ = obj;
}
T operator*() const
{
return **itData_;
}
/*Comparing values of two iterators*/
bool operator<(const iterator& obj)
{
return **itData_ < **obj.itData_;
}
/*Substracting two iterators*/
difference_type operator-(const iterator& obj)
{
return itData_ - obj.itData_;
}
/*Moving iterator backward for value*/
iterator operator-(const int value)
{
return itData_ - value;
}
/*Adding two iterators*/
difference_type operator+(const iterator& obj)
{
return itData_ + obj.itData_;
}
/*Moving iterator forward for value*/
iterator operator+(const int value)
{
return itData_ + value;
}
bool operator!=(const iterator& obj)
{
return (itData_ != obj.itData_);
}
bool operator==(const iterator& obj)
{
return (itData_ == obj.itData_);
}
T** operator++()
{
return ++itData_;
}
T** operator--()
{
return --itData_;
}
};
iterator begin() const
{
return myData_;
}
iterator end() const
{
return myData_ + myIndex_;
}
};
template<class T>
ostream& operator<<(ostream& out, const Set<T>& obj)
{
for (int i = 0;i < 3; ++i)
{
out << *obj.myData_[i] << "\n";
}
return out;
}
//file Set_impl.h
#pragma once
#include "stdafx.h"
#include "Set.h"
template<class T>
Set<T>::Set()
{
mySize_ = 3;
myIndex_ = 3;
myData_ = new T*[mySize_];
myData_[0] = new T(3);
myData_[1] = new T(1);
myData_[2] = new T(2);
}
//main
include "stdafx.h"
#include "Set_impl.h"
int _tmain(int argc, _TCHAR* argv[])
{
Set<int> a;
Set<int>::iterator beg_ = a.begin();
Set<int>::iterator end_ = a.end();
std::sort(beg_,end_);//WONT SORT THIS RANGE
cin.get();
return 0;
}
为什么 sort 不能接受这个迭代器,即使我已经提供了 sort 工作所需的所有运算符?我认为检查发生了什么的最好方法是粘贴此代码并先运行它。 谢谢
最佳答案
不幸的是,您的代码一团糟。
禁止它编译的大概是:
class iterator : public std::iterator<std::random_access_iterator_tag, T*>
这表示当您执行 *iterator
时,它会产生一个 T*
。但是看看 operator*
实际返回的是什么:
T operator*() const
我可以通过将它们更改为:
class iterator : public std::iterator<std::random_access_iterator_tag, T>
和
T& operator*() const
(除了许多其他更改,因为 GCC 似乎不太喜欢这个)
/*Comparing values of two iterators*/
bool operator<(const iterator& obj)
{
return **itData_ < **obj.itData_;
}
这也是错误的。它应该与operators ==
和!=
有关,也就是说,它不应该比较值,而是比较迭代器。 (幸运的是,我怀疑 std::sort
实际上曾经使用过这种方法。)
T** operator++()
{
return ++itData_;
}
T** operator--()
{
return --itData_;
}
这些应该返回对迭代器本身的引用(同样,返回值很可能没有被库使用)。
关于c++ - 为什么我不能对这个容器进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2701279/