c++STL系列——(十一)常用算法

目录

引言

一、排序

二、搜索

三、转换

四、比较

五、合并

总结


引言

本文将介绍C++ STL中最常用的算法,包括排序、搜索、转换、比较、合并等。我们将逐一介绍这些算法,并提供示例代码以便更好地理解每个算法的用法。

一、排序

排序是STL中最常用的算法之一,它可以将容器中的元素按升序或降序排列。STL提供了几种不同的排序算法,包括快速排序、堆排序、归并排序等。

以下是STL中的常见排序算法:

  • std::sort:使用快速排序算法进行排序。
  • std::stable_sort:使用归并排序算法进行排序,保持相等元素的相对顺序不变。
  • std::partial_sort:部分排序算法,可以将前n个元素排序,而后面的元素则不需要排序。
  • std::nth_element:找到第n个元素。该算法使用快速排序的一部分来实现,因此比完整的快速排序更快。

以下是一个简单的示例代码,演示了如何使用std::sort进行排序:

#include 
#include 
#include 

int main()
{
    std::vector v{ 5, 2, 3, 1, 4 };
    std::sort(v.begin(), v.end()); // sort the vector
    for (auto i : v) {
        std::cout << i << ' '; // print out the sorted vector
    }
    return 0;
}

输出结果:1 2 3 4 5

二、搜索

搜索算法可以在STL中用于在容器中查找元素。STL提供了几种不同的搜索算法,包括二分搜索、线性搜索等。

以下是STL中的常见搜索算法:

  • std::binary_search:使用二分搜索算法来查找元素。
  • std::find:使用线性搜索算法来查找元素。
  • std::lower_bound / std::upper_bound:使用二分搜索算法在有序容器中查找元素。lower_bound返回第一个大于或等于指定值的元素,而upper_bound返回第一个大于指定值的元素。

以下是一个简单的示例代码,演示了如何使用std::find进行线性搜索:

#include 
#include 
#include 

int main()
{
    std::vector v{ 5, 2, 3, 1, 4 };
    auto it = std::find(v.begin(), v.end(), 3); // find the element 3
    if (it != v.end()) {
        std::cout << "Found element: " << *it << '\n'; // print out the found element
    }
    else {
        std::cout << "Element not found\n";
    }
    return 0;
}

输出结果:Found element: 3

三、转换

STL中的转换算法可用于执行各种转换,例如将元素从一种容器类型转换为另一种容器类型。这些算法还可以用于将容器中的元素映射到新的值。

以下是STL中的常见转换算法:

  • std::transform:使用一元或二元函数将一个容器中的元素映射到新的值。可以使用此算法来在两个容器之间执行转换。
  • std::copy:将一个容器的元素复制到另一个容器中。可以使用此算法来将元素从一个容器类型转换为另一个容器类型。

以下是一个简单的示例代码,演示了如何使用std::transform将一个容器中的元素映射到新的值:

#include 
#include 
#include 

int main()
{
    std::vector v{ 1, 2, 3, 4, 5 };
    std::vector v2(v.size());
    std::transform(v.begin(), v.end(), v2.begin(), [](int x) { return x * x; }); // square every element in v and store the result in v2
    for (auto i : v2) {
        std::cout << i << ' '; // print out the squared vector
    }
    return 0;
}

输出结果:1 4 9 16 25

四、比较

STL中的比较算法可用于执行各种比较操作,例如比较两个容器中的元素或查找最大/最小值。

以下是STL中的常见比较算法:

  • std::equal:比较两个容器是否相等。
  • std::max / std::min:返回容器中的最大或最小元素。
  • std::lexicographical_compare:比较两个容器的字典序。该算法将两个容器逐个元素进行比较,直到找到不同的元素为止。

以下是一个简单的示例代码,演示了如何使用std::max返回容器中的最大值:

#include 
#include 
#include 

int main()
{
    std::vector v{ 1, 2, 3, 4, 5 };
    auto max_elem = std::max_element(v.begin(), v.end()); // find the maximum element
    std::cout << "Maximum element: " << *max_elem << '\n'; // print out the maximum element
    return 0;
}

输出结果:Maximum element: 5

五、合并

STL中的合并算法可用于将两个已排序的容器合并为一个已排序的容器。

以下是STL中的常见合并算法:

  • std::merge:将两个已排序的容器合并为一个已排序的容器。

以下是一个简单的示例代码,演示了如何使用std::merge将两个已排序的容器合并为一个已排序的容器:

#include 
#include 
#include 

int main()
{
    std::vector v1{ 1, 3, 5 };
    std::vector v2{ 2, 4, 6 };
    std::vector merged(v1.size() + v2.size());
    std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), merged.begin()); // merge the two vectors
    for (auto i : merged) {
        std::cout << i << ' '; // print out the merged vector
    }
    return 0;
}

输出结果:1 2 3 4 5 6

总结

上述算法只是STL中的一部分。本文提供了一些常用的算法示例,以便更好地了解这些算法的实现和用法。在实际编程中,可以根据实际需求选择适当的算法。

需要注意的是,STL中的许多算法都要求容器中的元素是可比较的,因此需要定义比较函数或使用默认比较函数。另外,STL中的许多算法都要求容器是已排序的,因此需要使用排序算法进行排序。

你可能感兴趣的:(算法,算法,c++,排序算法,开发语言,java)