簡體   English   中英

checked_array_iterator <T> 在C ++ 11中

[英]checked_array_iterator<T> in C++11

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);

它也更有效,因為它只檢查一次大小是否正常,而不是每個元素一次。

在某些情況下,您可以使用Eigen Map (或編寫類似的實現)。 它本質上是一個向量,它不管理自己的存儲,但在構造函數中獲取指針和大小。 在這方面,它與stdext::checked_array_iterator<T>提供的安全級別非常相似。 另一方面,它並不意味着是一個迭代器,它意味着是一個矩陣(或矢量作為特例)類。 Ane Eigen既是免費的,也是多平台的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM