我需要一个数组,其中大小在编译时已知。我知道我可以使用std :: vector或boost :: array。但这并不教我如何在内部工作。除了使用初始值设定项之外,我也找不到如何将项目添加到boost :: array。我已经为通用数组编写了以下代码。我的目的是熟悉的迭代器,模板特等等以下是代码实现一个支持迭代器的通用固定大小数组
template<typename T>
struct iterator_traits
{
typedef T value_type;
typedef T& reference_type;
typedef T* iterator;
typedef const T* const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
};
template<typename T>
struct iterator_traits<T*>
{
typedef T* value_type;
typedef T*& reference_type;
typedef T** iterator;
typedef const T const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
};
template<typename T, size_t size = 10>
class Array
{
public:
typedef typename iterator_traits<T>::value_type value_type;
typedef typename iterator_traits<T>::reference_type reference_type;
typedef typename iterator_traits<T>::iterator iterator;
typedef typename iterator_traits<T>::const_iterator const_iterator;
typedef typename iterator_traits<T>::reverse_iterator reverse_iterator;
Array() : lastIndex(0) {
}
void add(value_type element) {
if(lastIndex >= size)
throw std::out_of_range("Array is full");
array_[lastIndex++] = element;
}
reference_type at(unsigned int index){
if(index < size)
return array_[index];
else
throw std::out_of_range("Invalid index");
}
size_t capacity(){
return size;
}
iterator begin(){
return array_;
}
iterator end(){
return array_ + size;
}
const_iterator begin() const{
return array_;
}
const_iterator end() const{
return array_ + size;
}
reverse_iterator rbegin() {
return reverse_iterator(end());
}
reverse_iterator rend() {
return reverse_iterator(begin());
}
private:
value_type array_[size];
unsigned int lastIndex;
};
上面的代码工作得很好。以下是我的问题
1 - 如何创建我的阵列,如boost :: array呢?类似于
Array<int> ints = { 10, 12 };
2 - 代码中是否有任何缺陷?
3 - 我不得不使用专门的特质指针类型。这是最佳做法吗?
4 - 迭代器模式是否正确实现?
任何想法都会很棒!
std :: iterator_traits(#include)已经专门用于指针,你不需要提供你自己的指针。 –
2009-06-27 21:44:21
你是什么意思,你不能添加任何东西来提高:数组? – GManNickG 2009-06-27 22:14:39