我正在进行合并排序功能 . 我得到了排序 - 我试图让我的合并部分完成 . 假设我正在学习C,对指针有粗略的了解,并且不理解std :: vector :: iterator的所有规则(或std :: vector's) .
假设num是从大小为“int ar [num]”的数组中复制(std :: copy)值的原始std :: vector的大小 . 假设farray的值为(0到(num / 2)),sarray的值为((num / 2)到num) .
int num = original.size();
std::vector<int> final(num);
for (std::vector<int>::iterator it = farray.begin(); it != farray.end(); ++it) {
for (std::vector<int>::iterator iter = sarray.begin(); iter != sarray.end(); ++iter) {
if (*it > *iter) final.push_back(*it);
else
final.push_back(*iter);
}
}
这段代码编译,我最新稳定版本的Bloodshed Dev-C不会抛出任何警告或错误 . 我不知道这是否有效,我仍然需要尝试cout所有的final值 . 我只是想知道这是否常见,容易出错,还是只是风格不好 . 如果是这样,你会如何
6 回答
是的,你可以这样做 . 是的,它经常容易出错 . 事实上,编写循环本身容易出错,这是在STL中使用算法的一个参数,如for_each,copy和transform .
只要不重用循环变量,就可以嵌套任何类型的循环(for,while,do while) . 如果您尝试它会编译但在运行时可能会失败 . 虽然技术上允许在现代C和C中对嵌套循环变量使用相同的名称,但这是令人困惑的,应该避免 .
除了已经提到的循环变量重用问题之外,它不会比单个循环更容易或更不容易出错 .
阅读有关limits嵌套循环的更多信息 .
是的,您可以将循环或其他语句嵌套到您想要的任何深度(在合理范围内;有限制,如另一个答案所述,但它们远远超出您应该需要的程度) .
嵌套for循环是一种完全合法的做事方式 . 例如,它是遍历2D阵列的经典“旧学校”方式 - 一个循环沿y轴向下,另一个循环沿x轴向下 .
现在,对于那些孩子和他们的每个循环,迭代器和映射函数,可以说有这样的方法(对于某些更好的定义),但嵌套循环工作得很好 . 使用C或指针不会改变它 .
这是有效的......但for循环可能不是你想要的 . 当你使用两个for循环时,每次外循环循环时,你的内循环会一直回到起始位置 . 所以如果你的载体包含:
然后你的最终数组将包含如下内容:
因为您正在测试每个组合,并将较大的组合添加到最终列表中 . 更好的解决方案可能是记住每个列表的迭代器,并使用一个循环 . 不要遍历列表,只需将它们放在一起 - 如果sarray有更大的数字,然后递增你的sarray迭代器,并将其与旧的farray迭代器进行比较 . 当sarray和farray都是空的时候停止你的循环 .
我没有测试过 - 如果这是作业,那么请尝试理解我做了什么,自己去写,而不是复制粘贴 .
除了合并排序算法之外,使用迭代器嵌套for循环与嵌套for循环有两个变量i和j一样有效 .