暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++高级学习:第二十一节-交换函数

Cpp入门到精通 2024-03-21
84

点击蓝字 关注我们

c++高级学习

第二十一节  交换函数


      交换算法用于交换容器中的元素或序列中的元素位置。这些算法通常用于重新排列数据或执行特定的操作。


swap: 用于交换两个元素的值。

这个函数接受两个参数,类型为 T 的引用 a 和 b,并将它们的值进行交换。它的模板原型为:

    template<class T>
    void swap(TaTb);

    看一个简单的例子,交换两个整型对象:

      int a = 10, b = 20;
      cout << "交换前:a=" << a << " " << "b=" << b << endl;
      swap(a, b);
      cout << "交换前:a=" << a << " " << "b=" << b << endl;

      结果如下:

        交换前:a=10 b=20
        交换前:a=20 b=10

        swap 函数是为了提供一种通用的、高效的方式来交换两个对象的值。对于内置类型自定义类型,都可以使用swap 函数来进行值的交换,而无需关心具体的实现。

        我们也可以使用swap交换两个容器中的元素:

          vector<int>v1 = { 1,2,3,4,5 };
          vector<int>v2 = { 10,20,30,40,50,60 };
          cout << "交换前:\nv1容器:";
          for_each(v1.begin(), v1.end(), print);
          cout << "\nv2容器:";
          for_each(v2.begin(), v2.end(), print);
          swap(v1, v2);
          cout << "\n交换后:\nv1容器:";
          for_each(v1.begin(), v1.end(), print);
          cout << "\nv2容器:";
          for_each(v2.begin(), v2.end(), print);

          结果如下:

            交换前:
            v1容器:1 2 3 4 5
            v2容器:10 20 30 40 50 60
            交换后:
            v1容器:10 20 30 40 50 60
            v2容器:1 2 3 4 5

            iter_swap: 用于交换两个迭代器指向的元素。

            该函数有两个参数,为两个迭代器,分别指向要交换元素的位置。iter_swap 函数会交换两个迭代器所指向的元素值。如下例子所示:

              vector<int>v1 = { 1,2,3,4,5 };
              cout << "交换前:";
              for_each(v1.begin(), v1.end(), print);
              iter_swap(v1.begin(), v1.end()-1);
              cout << "交换后:";
              for_each(v1.begin(), v1.end(), print);

              我们首先定义了一个包含五个整数元素的向量 v1,然后使用iter_swap 函数将第一个元素和最后一个元素进行了交换。v1.end() 并不是 v1 的最后一个元素,而是指向容器 v1 结尾后的下一个位置的迭代器。在 C++ 中,通常采用左闭右开的区间表示法,即容器的范围通常表示为 [begin, end),其中 begin 是容器的起始位置,而 end 是容器结尾后的下一个位置。你也可以使用如下方式来表示容器的最后一个元素,prev() 函数是一个辅助函数,用于获取给定迭代器的前一个位置的迭代器

                pre(v1.end())

                swap_ranges: 用于交换两个范围中的元素。

                这个函数有三个参数

                前两个参数表示第一个范围的起始和结束位置,第三个参数表示第二个范围的起始位置。

                  #include<iostream>
                  using namespace std;
                  #include<vector>
                  #include<algorithm>
                  void print(int x) {
                  cout << x << " ";
                  }
                  int main() {
                  vector<int>v1 = { 1,2,3,4,5 };
                  vector<int>v2 = { 10,20,30,40,50,60 };
                  cout << "交换前:\nv1容器:";
                  for_each(v1.begin(), v1.end(), print);
                  cout << "\nv2容器:";
                  for_each(v2.begin(), v2.end(), print);
                  swap_ranges(v1.begin(), v1.end(),v2.begin());
                  cout << "\n交换后:\nv1容器:";
                  for_each(v1.begin(), v1.end(), print);
                  cout << "\nv2容器:";
                    for_each(v2.begin(), v2.end(), print);
                  system("pause");
                  return 0;
                  }

                  swap_ranges 函数会将范围 [v1.begin, v1.end()) 中的元素与范围 [v2.begin(), ...) 中的元素进行交换,并返回指向交换后第二个范围中最后一个元素的下一个位置的迭代器。

                    交换前:
                    v1容器:1 2 3 4 5
                    v2容器:10 20 30 40 50 60
                    交换后:
                    v1容器:10 20 30 40 50
                    v2容器:1 2 3 4 5 60

                    我们发现这种交换方式并不是完全交换的,这和我们之前讲到的复制函数是一样的,这种交换方式只交换了容器的元素,而没有调整容器的大小,导致两个容器的大小不一致。在这种情况下,虽然元素交换了,但是有些元素并没有被覆盖,而是被保留了下来,导致了部分交换。为了实现完全交换,需要确保交换后的容器大小相同,否则将会出现大小不匹配的情况

                    我们在交换的时候执行以下操作:

                      v1.resize(v2.size());
                      v2.resize(v1.size());

                      通过互换容器的大小,可以实现完全交换。

                      交换函数的相关操作的讲解到此结束,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!

                      END

                      往期推荐

                      C++高级学习:第二十节-复制函数

                      C++高级学习:第十九节-比较算法

                      C++高级学习:第十八节-查找算法(下)

                      C++高级学习:第十七节-查找算法(上)

                      分享、在看与点赞,至少我要拥有一个吧

                      文章转载自Cpp入门到精通,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论