我正在尝试为std::iterator
MFC类编写CArray<Type,ArgType>
。这就是我到目前为止所做的事情:
template <class Type, class ArgType>
class CArrayIterator : public std::iterator<std::random_access_iterator_tag, ArgType>
{
public:
CArrayIterator(CArray<Type,ArgType>& array_in, int index_in = 0)
: m_pArray(&array_in), m_index(index_in)
{
}
void operator++() { ++m_index; }
void operator++(int) { ++m_index; }
void operator--() { --m_index; }
void operator--(int) { --m_index; }
void operator+=(int n) { m_index += n; }
void operator-=(int n) { m_index -= n; }
typename ArgType operator*() const{ return m_pArray->GetAt(m_index); }
typename ArgType operator->() const { return m_pArray->GetAt(m_index); }
bool operator==(const CArrayIterator& other) const
{
return m_pArray == other.m_pArray && m_index == other.m_index;
}
bool operator!=(const CArrayIterator& other) const
{
return ! (operator==(other));
}
private:
CArray<Type,ArgType>* m_pArray;
int m_index;
};
我还提供了两个辅助函数来创建像这样的迭代器:
template<class Type, class ArgType>
CArrayIterator<Type,ArgType> make_begin(CArray<Type,ArgType>& array_in)
{
return CArrayIterator<Type,ArgType>(array_in, 0);
}
template<class Type, class ArgType>
CArrayIterator<Type,ArgType> make_end(CArray<Type,ArgType>& array_in)
{
return CArrayIterator<Type,ArgType>(array_in, array_in.GetSize());
}
为了测试代码,我编写了一个简单的class A
并试图像这样使用它:
class A
{
public:
A(int n): m_i(n)
{
}
int get() const
{
return m_i;
}
private:
int m_i;
};
struct Test
{
void operator()(A* p)
{
std::cout<<p->get()<<"\n";
}
};
int main(int argc, char **argv)
{
CArray<A*, A*> b;
b.Add(new A(10));
b.Add(new A(20));
std::for_each(make_begin(b), make_end(b), Test());
return 0;
}
但是当我编译这段代码时,我收到以下错误:
错误4错误C2784:'布尔 std :: operator&lt;(const 的std :: _树&LT; _Traits&GT; &安培;,const的 的std :: _树&LT; _Traits&GT; &amp;)':不能 推导'const。的模板参数 的std :: _树&LT; _Traits&GT; &安培;”从 'CArrayIterator'C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ xutility 1564 Vs8Console
任何人都可以了解我做错了什么以及如何纠正错误?如果重要的话,我正在使用VC9编译器。
答案 0 :(得分:4)
你已经说过你的迭代器是一个“随机访问迭代器”。随机访问迭代器的部分要求是您提供<
,<=
,>
和>=
比较运算符,<
给出严格的弱排序和他们之间的通常关系。
您需要提供适当的比较运算符,或者您可以考虑“降级”为双向迭代器。
答案 1 :(得分:3)
根据您要执行的操作,您可能根本不需要编写迭代器类。 CArray
与vector
类似,因为底层数据存储只是一个C风格的数组,而类管理分配&amp;为你解除分配。您可以使用GetData()
获取指向数据本身的指针,并使用简单的指针数学来查找结尾;与使用STL <algorithm>
的原始C风格数组的方式大致相同。即:
#define _AFXDLL
#include <afx.h>
#include <afxwin.h> // MFC core and standard components
#include <afxtempl.h>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
CArray<int, int> ints;
srand((unsigned)time(0));
for( int i = 0; i < 10; ++i )
ints.Add(rand()%10);
vector<int> ints2;
copy(ints.GetData(), ints.GetData()+ints.GetCount(), back_inserter(ints2));
cout << "Original : ";
copy(ints.GetData(), ints.GetData()+ints.GetCount(), ostream_iterator<int>(cout, " "));
cout << endl
<< endl
<< "Copy : ";
copy(ints2.begin(), ints2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}