I think you can win with both. You can have very convenient and general abstractions like ranges which perform very well too. In addition, you can provide all of the usual range features to make them compatible with generic algorithms, and a few extra methods for extra features, like changing the block size.