如何创建来自不同大小char*缓冲区的双向迭代器?
- 内容介绍
- 文章标签
- 相关推荐
本文共计665个文字,预计阅读时间需要3分钟。
我似乎找不到一个简单的方法来直接从`char* buffer`和`size_t bufferSize`获取双向迭代器。通常,这需要额外的处理来确保迭代器的正确性和双向功能。以下是一个简化的方法,不涉及复杂的数据结构,但可能不是最直接的方式:
c#include #include
typedef struct { char* start; char* end;} BidirectionalIterator;
bool isValidIndex(size_t index, size_t bufferSize) { return index BidirectionalIterator createBidirectionalIterator(const char* buffer, size_t bufferSize) { BidirectionalIterator iterator; iterator.start=buffer; iterator.end=buffer + bufferSize; return iterator;} bool hasNext(BidirectionalIterator iterator) { return iterator.start bool hasPrev(BidirectionalIterator iterator) { return iterator.start > iterator.start;} char getNext(BidirectionalIterator* iterator) { if (!hasNext(*iterator)) { return '\0'; // End of iteration } return (*iterator).start++;} char getPrev(BidirectionalIterator* iterator) { if (!hasPrev(*iterator)) { return '\0'; // End of iteration } return (*iterator).start--;} int main() { const char* buffer=example; size_t bufferSize=sizeof(buffer) - 1; // Exclude null terminator BidirectionalIterator iterator=createBidirectionalIterator(buffer, bufferSize); // Example usage: while (hasNext(iterator)) { char ch=getNext(&iterator); // Process character 'ch' } return 0;} 这个例子创建了一个简单的双向迭代器,它可以从给定的`buffer`和`bufferSize`开始。你可以使用`getNext`和`getPrev`函数来向前和向后迭代字符。请注意,这种方法不涉及动态内存分配,也不需要复杂的迭代器实现。 我似乎无法找到一个简单的解决方案,即如何从char *bufferwith defined获取双向迭代器bufferSize。我不想将缓冲区复制到std::string(太昂贵),我只想像std_whatever::buffer_wrapper myWrappedBuffer(myBuffer, mySize);然后在函数中使用myWrappedBuffer.begin()和。最简单的方法是什么?我真的不想自己实现迭代器。我知道有,也许有,但我不想为此使用 boost,也不能使用 c++17。myWrappedBuffer.end()boost::string_refstd::string_view
char *b=buffer;
这是您的起始迭代器。
char *e=buffer+buffersize;
这是你的结束迭代器。
简单的花园多样性指针不仅满足双向迭代器的所有要求,而且满足随机访问迭代器的所有要求,并且通常可以在需要任何类型迭代器的任何地方使用,并且它们将像一个迭代器一样工作。所有(写得很好的)基于迭代器的模板都可以很好地使用指针。
您甚至可以将它们提供给std::iterator_traits,并获得有意义的结果。自己尝试一下,看看会发生什么。
本文共计665个文字,预计阅读时间需要3分钟。
我似乎找不到一个简单的方法来直接从`char* buffer`和`size_t bufferSize`获取双向迭代器。通常,这需要额外的处理来确保迭代器的正确性和双向功能。以下是一个简化的方法,不涉及复杂的数据结构,但可能不是最直接的方式:
c#include #include
typedef struct { char* start; char* end;} BidirectionalIterator;
bool isValidIndex(size_t index, size_t bufferSize) { return index BidirectionalIterator createBidirectionalIterator(const char* buffer, size_t bufferSize) { BidirectionalIterator iterator; iterator.start=buffer; iterator.end=buffer + bufferSize; return iterator;} bool hasNext(BidirectionalIterator iterator) { return iterator.start bool hasPrev(BidirectionalIterator iterator) { return iterator.start > iterator.start;} char getNext(BidirectionalIterator* iterator) { if (!hasNext(*iterator)) { return '\0'; // End of iteration } return (*iterator).start++;} char getPrev(BidirectionalIterator* iterator) { if (!hasPrev(*iterator)) { return '\0'; // End of iteration } return (*iterator).start--;} int main() { const char* buffer=example; size_t bufferSize=sizeof(buffer) - 1; // Exclude null terminator BidirectionalIterator iterator=createBidirectionalIterator(buffer, bufferSize); // Example usage: while (hasNext(iterator)) { char ch=getNext(&iterator); // Process character 'ch' } return 0;} 这个例子创建了一个简单的双向迭代器,它可以从给定的`buffer`和`bufferSize`开始。你可以使用`getNext`和`getPrev`函数来向前和向后迭代字符。请注意,这种方法不涉及动态内存分配,也不需要复杂的迭代器实现。 我似乎无法找到一个简单的解决方案,即如何从char *bufferwith defined获取双向迭代器bufferSize。我不想将缓冲区复制到std::string(太昂贵),我只想像std_whatever::buffer_wrapper myWrappedBuffer(myBuffer, mySize);然后在函数中使用myWrappedBuffer.begin()和。最简单的方法是什么?我真的不想自己实现迭代器。我知道有,也许有,但我不想为此使用 boost,也不能使用 c++17。myWrappedBuffer.end()boost::string_refstd::string_view
char *b=buffer;
这是您的起始迭代器。
char *e=buffer+buffersize;
这是你的结束迭代器。
简单的花园多样性指针不仅满足双向迭代器的所有要求,而且满足随机访问迭代器的所有要求,并且通常可以在需要任何类型迭代器的任何地方使用,并且它们将像一个迭代器一样工作。所有(写得很好的)基于迭代器的模板都可以很好地使用指针。
您甚至可以将它们提供给std::iterator_traits,并获得有意义的结果。自己尝试一下,看看会发生什么。

