我可能会使用迭代器而不是索引来执行此操作,仍然使用您自己的 for 循环:
const int NUM_BITS_IN_CHUNK = 128;
const int CHUNK_SIZE = NUM_BITS_IN_CHUNK / CHAR_BIT;
for(std::string::const_iterator iter = str.begin(); iter < str.end(); iter += CHUNK_SIZE)
{
your_func(iter, iter + CHUNK_SIZE);
}
boost::iterator_adaptor 代码看起来像这样。请注意,为简单起见,在示例中我只获得每个块的四个字节而不是 16 个字节:
#include <iostream>
#include <string>
#include <boost/iterator_adaptors.hpp>
struct string_chunk_iterator : public boost::iterator_adaptor<string_chunk_iterator, std::string::const_iterator>
{
string_chunk_iterator(const std::string::const_iterator& base) : iterator_adaptor(base) { }
private:
friend class boost::iterator_core_access;
void increment() { this->base_reference() = this->base() + 4; }
void advance(typename iterator_adaptor::difference_type n)
{
this->base_reference() = this->base() + (4 * n);
}
};
int main()
{
const std::string tester(20, 'A');
string_chunk_iterator iter(tester.begin());
string_chunk_iterator str_end(tester.end());
for(; iter != str_end; ++iter)
{
std::string chunk(&*iter, &*(iter + 1));
std::cout << chunk << std::endl;
}
return 0;
}