c++ - 在 C++ 中与循环中的变化值进行比较是一种很好的形式吗?

标签 c++ merge vector coding-style member-functions

毫无疑问,你们中的一些人已经看过我最近的帖子,都是关于同一个程序的。我一直遇到问题。重申一下:仍在学习,不是很高级,不太了解指针,没有上课,根本不了解OOP概念等。这段代码只是将两个已排序的 vector farray和sarray合并为一个已排序的 vector vector 。至少,我希望这就是它的作用。告诉我:

    //int num is to find the size of the original vector and
    //build up farray and sarray; not used in the merge process
    int num = original.size() 
    std::vector<int> final;

    std::vector<int>::iterator it = farray.begin();
    std::vector<int>::iterator iter = sarray.begin();

    //farray.size() == (0 thru (num / 2))
    //sarray.size() == ((num / 2) thru num)
    for (;it != farray.end() && iter != sarray.end();) {
        if (*it > *iter) {
            final.push_back(*it);
            it++;
        }    
        else
        {
            final.push_back(*iter);
            iter++;
        }

            if (it == farray.end()) {
                for (int i = 0; iter < sarray.end(); i++) {
                    final.push_back(*iter);
                }
            }

            if (iter == sarray.end()) {
                for (int i = 0; it < farray.end(); i++) {
                    final.push_back(*iter);
                }
            }
        }

我重写了我的合并排序函数的合并部分,以便...好吧,让它工作。我实际上对这段代码有几个问题:

  1. 与 std::vector::iterators 进行比较是一种很好的形式吗?如果 for 循环可能会在下一次传递时更改它们,它会为我的最后两个 if 语句 && iter?
  2. iter 和 it 的值会在这个循环的最后一次通过时改变并搞砸我的代码吗?将我最后的 if 语句放在 *it 和 *iter 比较之前吗?
  3. end() 成员函数是否引用调用它的任何对象的最后一个值?看起来它可能会以某种方式延伸过去。

编辑:我会在明天回复所有回复,所以如果您想了解更多信息,请到时再回来查看。已经过了午夜。晚安。

最佳答案

1 。比较与 for 循环条件来自同一容器的迭代器是很好的,但是只有当您在 for 循环语句的增量部分或 for 循环本身的主体中移动一个或其他迭代器时,这才有意义。在此 for 循环中,您比较 iter反对sarray.end()但是 for 循环永远不会改变 iter .这意味着要么没有迭代,要么 for 循环永远不会终止。另外,您可能想使用 !=而不是 <为了比较。 ==!=适用于所有迭代器,<没有。

            for (int i = 0; iter != sarray.end(); i++) {
                final.push_back(*iter);
            }

作为iter从您希望循环开始的地方开始,您可能需要这样的东西:

            for (; iter != sarray.end(); ++iter) {
                final.push_back(*iter);
            }

由于您仍在学习(虽然我们不是所有人!),通过这样的算法工作可能具有指导意义,但您应该注意 std::merge这可能会做你想要的。

std::merge( farray.begin(), farray.end(), sarray.begin(), sarray.end(), std::back_inserter( final ) );

(您需要 #include <iterator><algorithm> 。)

2。我没有看到递增的 iter 或它在外部 for 循环中使后面的 for 循环中的逻辑无效,1. 中的点放在一边。

3。 end()指向容器末尾后的一个,因此您可以将其用于循环终止检查,但您不应该尝试将“==”的迭代器解引用为“.end()”。

关于c++ - 在 C++ 中与循环中的变化值进行比较是一种很好的形式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/767099/

相关文章:

c++ - 如何将 Valgrind 与介子一起使用?

C++序列化包含其他对象数组的对象

c++ - 确定圆弧中点的算法

python(pandas)在数据帧内合并,无需for循环

mercurial - 我如何在 Mercurial 中 merge 本地更改(如果有其他更改)?

math - 比较两个角度

c++ - 定义一个被多次继承的虚方法

git - 在 Git 中一次 merge 2 个以上的分支/头?

c++ - 函数模板未正确生成随机数

c++ - 接受 vector 、索引和返回元素的函数