繁体   English   中英

你可以在C ++中嵌入循环(在彼此中)

[英]Can you embed for loops (in each other) in C++

我正在进行合并排序功能。 我得到了排序 - 我试图让我的合并部分完成。 假设我正在学习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值。 我只是想知道这是否常见,容易出错,还是只是风格不好。 如果是这样,你会如何

这是有效的......但for循环可能不是你想要的。 当你使用两个for循环时,每次外循环循环时,你的内循环会一直回到起始位置。 所以如果你的载体包含:

farray: 10 9 8 4 3
sarray: 7 6 4 3 1

然后你的最终数组将包含如下内容:

10 10 10 10 10 9 9 9 9 9 8 8 8 8 8 7 6 4 4 4 7 6 4 3 3

因为您正在测试每个组合,并将较大的组合添加到最终列表中。 更好的解决方案可能是记住每个列表的迭代器,只需使用一个循环。 不要循环遍历列表,只需将它们放在一起 - 如果sarray有更大的数字,然后递增你的sarray迭代器,并将其与旧的farray迭代器进行比较。 当sarray和farray都是空的时候停止你的循环。

vector<int> fiter = farray.begin();
vector<int> siter = sarray.begin();
vector<int> final;

// Let's traverse both farray and sarray.
// We'll want to stop this loop once we've traversed both lists.
while (fiter != farray.end() && siter != sarray.end())
{
    if (fiter == farray.end())
    {
        // we must have gone right through farray - 
        // so use the value from sarray, and go to the next one
        final.push_back(*siter);
        siter++;
    }
    else if (siter == sarray.end())
    {
        // we must have gone right through sarray - 
        // so use the value from farray, and go to the next one
        final.push_back(*fiter);
        fiter++;
    }
    else if (*siter > *fiter)
    {
        // siter is the bigger of the two - add it to the final list, and
        // go to the next sarray entry
        final.push_back(*siter);
        siter++;
    }
    else // *fiter >= *siter
    {
        // fiter is the bigger of the two - add it to the final list, and
        // go to the next farray entry
        final.push_back(*fiter);
        fiter++;
    }
}

我没有测试过 - 如果这是作业,那么尝试理解我做了什么,自己去写,而不是复制+粘贴。

除了合并排序算法之外,使用迭代器嵌套for循环与嵌套for循环有两个变量ij一样有效。

只要不重用循环变量,就可以嵌套任何类型的循环(for,while,do while)。 如果您尝试它会编译但在运行时可能会失败。 虽然在技术上允许在现代C和C ++中对嵌套循环变量使用相同的名称,但这是令人困惑的,应该避免。

除了已经提到的循环变量重用问题之外,它不会比单个循环更容易或更不容易出错。

阅读有关嵌套循环限制的更多信息。

嵌套for循环是一种完全合法的做事方式。 例如,它是遍历2D阵列的经典“旧学校”方式 - 一个循环沿y轴向下,另一个循环沿x轴向下。

现在,对于那些孩子和他们的每个循环,迭代器和映射函数,可以说是“更好”的方法来做到这一点,(对于一些更好的定义)但是嵌套循环工作得很好。 使用C ++或指针不会改变它。

是的,你可以这样做。 是的,它往往容易出错。 实际上,编写循环本身容易出错,这是在STL中使用算法的一个参数,如for_each,copy和transform。

是的,您可以将循环或其他语句嵌套到您想要的任何深度(在合理范围内;有限制,如另一个答案所述,但它们远远超出您应该需要的程度)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM