如何检查迭代器是否形成连续的内存区域?

Vin*_*ent 5 c++ file stream reinterpret-cast contiguous

我目前有以下函数来读取数据或原始数据的向量(_readStream是a std::ifstream):

template<typename IteratorType> 
inline bool MyClass::readRawData(
    const IteratorType& first, 
    const IteratorType& last, 
    typename std::iterator_traits<IteratorType>::iterator_category* = nullptr
    )
{
    _readStream.read(reinterpret_cast<char*>(&*first), (last-first)*sizeof(*first));
    return _readStream.good();
}
Run Code Online (Sandbox Code Playgroud)

第一个问题:这个功能对你来说好吗?

当我们直接读取内存块,如果从内存块只会工作firstlast是在内存中连续的.怎么检查?

Cam*_*ron 4

抛开示例函数不谈,如果不检查两者之间每个元素的地址,您永远无法完全确定迭代器将形成连续的内存。

不过,合理的完整性测试只是检查两者之间的内存区域是否与两者之间的计数相同:

assert(&*last - &*first == last - first &&
    "Iterators must represent a contiguous memory region");
Run Code Online (Sandbox Code Playgroud)

  • @stinky472:是的,我明白这是指针减法。我的意思是,除非指针指向同一数组中的对象,否则减法运算是未定义的,根据标准 5.7.6 (8认同)