请注意,没有插入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不能接受这个迭代器,即使我已经提供了排序工作所需的所有运算符?我认为检查发生了什么的最好方法是粘贴此代码并先运行它。 感谢
答案 0 :(得分:7)
不幸的是,您的代码完全混乱。
禁止编译的内容可能如下:
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_;
}
这些应该返回对迭代器本身的引用(同样,库中很可能不会使用返回值)。