const char *附近的轻质容器长度而不复制数据

时间:2010-07-15 03:21:46

标签: c++ boost stl iterator

我有一个传递const char *和长度的基础API:

foo(const char* data, const uint32_t len);

我想将这个数据/长度包装在一个可以重复的轻量级容器中,并且能够随机访问但不能复制(例如像矢量)。实现这一目标的最佳方法是什么? const char *数据不一定是'字符串';它可能包含NULL。

我正在使用STL和Boost。我见过boost :: as_array<>和as_literal<> - 这是合适的吗?

3 个答案:

答案 0 :(得分:4)

制作这样的课很容易。像这样:

template <class T>
class array_ref {
public:
    // makes it work with iterator traits..
    typedef T         value_type;
    typedef size_t    size_type;
    typedef ptrdiff_t difference_type;

    typedef T*        pointer;
    typedef T*        iterator;
    typedef T&        reference;

    typedef const T*  const_pointer;
    typedef const T*  const_iterator;
    typedef const T&  const_reference;

public:
    array_ref(T *p, size_t n) : data_(p), len_(n) {}

    // iteration
    iterator begin()             { return data_; }
    iterator end()               { return data_ + len_; }
    const_iterator begin() const { return data_; }
    const_iterator end() const   { return data_ + len_; }

    // access
    reference operator[](size_t n)             { return data_[n]; }
    reference at(size_t n)                     { return data_[n]; }
    const_reference operator[](size_t n) const { return data_[n]; }
    const_reference at(size_t n) const         { return data_[n]; }

    // capacity
    size_t size() const { return len_; }
    bool empty() const  { return size() == 0; }

    // raw access
    T* data() const { return data_; }

    // etc...
private:
    T* data_;
    size_t len_;
};

这看起来像一堆代码,大部分都不是绝对必要的。但是,由于它是一个模板,编译器只会为使用的方法生成代码。而实际的类本身只使用空间作为指针和长度成员。

但最终,这真的不是一个好处。由于指针本身是很好的指针,我可能只是在这里使用原始指针。

答案 1 :(得分:2)

我已将iterator_facade http://www.boost.org/doc/libs/1_43_0/libs/iterator/doc/iterator_facade.html与iterator_range

一起使用

您可以轻松使用iterator_range构建包装器http://www.boost.org/doc/libs/1_42_0/libs/range/doc/utility_class.html#iter_range

boost::iterator_range<char*> range(begin, begin + N);

可以使用iterator_facade

处理特殊情况

答案 2 :(得分:0)

我不认为as_array和/或as_literal会做你想做的事。虽然编写起来并不是非常困难,但我不知道现有的课程是否打算做你想做的事情(或者至少我认为你想要的)。

编辑:我可能不应该说我不知道​​任何这样的类 - 我只是不知道任何特别熟知,广泛使用或经过全面测试的。如果您搜索comp.lang.c ++和/或comp.lang.c ++。的档案,比如12到15年前左右,你可能会找到至少十几个(至少提供谷歌的新闻组搜索正在工作)在这一刻)。除非记忆力让我特别糟糕,否则我会在某个地方张贴一个(尽管我现在似乎无法找到它......)然而,你可能从他们的年龄开始猜测,你可能不会想要使用最多(任何?)他们原样 - 他们使用C ++通常很原始。