如果我有一个带有奇数个元素的向量,并且想对向量进行分段,那么我该如何构建一个循环来做到这一点,但是又不会超出范围?
像这样的数组:
[4, 5, 6, 3, 10, 2, 0]
(大小:7)
我想按2的段进行排序,所以它变成这样:
[4, 5, 3, 6, 2, 10, 0]
我在想这样的事情,但是随后向量将访问arr [8],这超出了范围。
for(int i = 0; i < arr.size(); i = i + 2) {
sort(arr.begin() + i, arr.begin() + i - 1);
}
答案 0 :(得分:0)
只需获得小于或等于数组大小的第一个偶数,然后将其用作循环的停止条件即可。
int main(){
std::array<int, 7> arr = {4, 5, 6, 3, 10, 2, 0};
auto size = arr.size() % 2 ? arr.size() - 1 : arr.size(); // if odd subtract one else use size
for (size_t i = 0; i < size - 2; i += 2)
std::sort(arr.begin() + i, arr.begin() + i + 2);
for (auto e : arr)
std::cout << e << " ";
}
输出:
4 5 3 6 10 2 0
答案 1 :(得分:0)
想到两个选择:
首先,您可以约束循环:
const int SegmentLen = 2;
for (int i=0; i+SegmentLen-1 < arr.size(); i += SegmentLen)
std::sort(arr.begin()+i, arr.begin()+i+SegmentLen);
第二,您可以循环固定次数:
auto segments = arr.size() / SegmentLen;
for (int i=0; i < segments; ++i)
std::sort(arr.begin() + (i*SegmentLen), arr.begin() + (i*SegmentLen) + SegmentLen);
//Handle any leftovers