首页 文章

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

提问于
浏览
2

我正在进行合并排序功能 . 我得到了排序 - 我试图让我的合并部分完成 . 假设我正在学习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 回答

  • 1

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

  • 7

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

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

    阅读有关limits嵌套循环的更多信息 .

  • 1

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

  • 0

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

    现在,对于那些孩子和他们的每个循环,迭代器和映射函数,可以说有这样的方法(对于某些更好的定义),但嵌套循环工作得很好 . 使用C或指针不会改变它 .

  • 0

    这是有效的......但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++;
        }
    }
    

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

  • 2

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

相关问题