[英]c++ std::vector iterator constructor with first == last
我有一个功能,需要将一个向量划分为n个子向量。 例如,它可能看起来像这样:
void foo(std::vector<uint8_t> vec, int numSubVectors){
size_t size = vec.size() / numSubVectors;
auto iter = vec.begin();
for (int i = 0; i < numSubVectors; ++i) {
auto sub_vec = std::vector<uint8_t>(iter, iter + size);
// do something with sub_vec
// ...
iter += size;
}
}
当用foo({}, 1)
调用时,我需要它来工作,其中sub_vec在循环的第一个(也是唯一的)迭代中被分配了一个空向量。 我担心std::vector<uint8_t>(iter, iter + size)
。 当第一个== last时,c ++标准是否允许使用其范围构造函数构造向量?
根据cplusplus.com的说法 ,“使用的范围是[first,last),其中包括first和last之间的所有元素,包括first所指向的元素,而不是last所指向的元素”,但是该语句没有任何作用。何时第一个==最后一个感觉?
我尝试在在线IDE上运行它,并且似乎可以正常工作( https://ideone.com/V9hylA ),因此显然不禁止使用它,但是它的行为不确定吗?
来自标准的iterator.requirements.general :
表示范围的迭代器和标记是可比较的。 如果i == s,则范围[i,s)为空; 除此以外 [...]
因此,当first == last时,标准将其明确定义为空范围。
第first == last
的迭代器对[first, last)
是我们定义一个空范围的方式。 在语法和逻辑上都是有效的。 从该迭代器对构造一个std::vector
会做正确的事情,并创建一个空容器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.