gpt4 book ai didi

c++ - C++11 中的 checked_array_iterator

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:55 26 4
gpt4 key购买 nike

C++11 提供了 std::array<T>包装 C 数组,但仅限于在编译时知道数组大小的地方。处理大小仅在运行时已知的数组的最佳方法是什么?

背景

我正在将一些代码从 MSVC 移植到 GCC。 MSVC 提供了 stdext::checked_array_iterator<T>为这样的代码行提供一些保护的模板:

std::copy(v.begin(), v.end(), stdext::checked_array_iterator<int*>(arr, numVals));

到目前为止,我可以想到两种选择:放弃安全检查或编写自己的实现。关于这一点,如果您对此实现提出任何建设性意见,我将不胜感激:

namespace stdext {
template<typename T>
struct checked_array_iterator
{
private:
T _val;
size_t _len;
public:
typedef typename std::remove_pointer<T>::type value_type;
checked_array_iterator(T val, size_t len) : _val(val), _len(len) {}
checked_array_iterator<T> operator++(int)
{
if(_len == 0)
throw std::range_error("Array iterator overrun");
checked_array_iterator<T> retval = *this;
_val++;
_len--;
return retval;
}
checked_array_iterator<T> & operator++()
{
if(_len == 0)
throw std::range_error("Array iterator overrun");
_val++;
_len--;
return *this;
}
value_type & operator*()
{
return *_val;
}
bool operator==(checked_array_iterator<T>& other) { return other._val == _val; }
bool operator!=(checked_array_iterator<T>& other) { return !(other == *this); }
T operator->() { return _val; }
};
}
namespace std
{
template <typename T>
struct iterator_traits<stdext::checked_array_iterator<T>>
{
typedef std::ptrdiff_t difference_type;
typedef typename std::remove_pointer<T>::type value_type;
typedef T pointer;
typedef value_type& reference;
typedef std::input_iterator_tag iterator_category;
};
}

最佳答案

会这么糟糕吗?

if (v.size() > numVals)
throw std::runtime_error("oops");
std::copy(v.begin(), v.end(), arr);

它也更有效,因为它只检查一次大小是否合适,而不是每个元素一次。

关于c++ - C++11 中的 checked_array_iterator<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25716841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com