如何使迭代器指向C ++ STL中预先分配的内存?

时间:2015-06-30 13:01:22

标签: c++ stl iterator

下面的示例中的某些内容。 alines为它赋予了价值。

{
uint8_t buffer[16];

#ifdef _WIN32
  std::vector<uint8_t>::iterator it_begin;
  it_begin._Ptr = (uint8_t*)buffer;
#else
  std::vector<uint8_t>::iterator it_begin((uint8_t*)buffer);
#endif

std::vector<uint8_t>::iterator it_end = it_begin + 16;
}

好的,让我试着更具体一点。我想从原始指针调用'parse'函数。

funcA(uint8_t* in, int32_t len) {
  // I would like to do:
  parse(req_, in, in + len); 
}


template<typename InputIterator>
std::tuple<result_type, InputIterator> parse(request& req, InputIterator begin, InputIterator end) {
    while (begin != end) {
        result_type result = consume(req, *begin++);
        if (result == good || result == bad)
            return std::make_tuple(result, begin);
    }
    return std::make_tuple(indeterminate, begin);
}

3 个答案:

答案 0 :(得分:2)

您不应该尝试强制std::vector::iterator遍历原始数组。如果您遇到原始数组,但想使用迭代器,那么请使用std::begin中的std::end<iterator>

std::uint8_t buffer[16];

auto it_begin = std::begin(buffer);
auot it_end = std::end(buffer);

答案 1 :(得分:2)

原始指针一种迭代器。因此,在请求迭代器的任何地方,您始终可以将指针传递到预先分配的缓冲区。

uint8_t buffer[16];

uint8_t* begin = buffer;
uint8_t* end = buffer + 16;

由于你有一个数组类型,你可以使用std::beginstd::end来自动查找开始和结束的过程;如果您以后需要更改数组大小,这将使事情变得更容易。

uint8_t* begin = std::begin(buffer);
uint8_t* end = std::end(buffer);

答案 2 :(得分:0)

好的,Ty每一个,它都有效。

uint8_t * buffer_begin = (uint8_t*)in;
uint8_t * buffer_end = ((uint8_t*)in) + len;

std::tie(result, std::ignore) = this_->request_parser_.parse(this_->request_, buffer_begin, buffer_end);