天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 19|回复: 0

C++中std::sort/std::stable_sort/std::partial_sort的区别及使用

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
某些算法会重排容器中元素的顺序,如std::sort。调用sort会重排输入序列中的元素,使之有序,它默认是利用元素类型的<运算符来实现排序的。也可以重载sort的默认排序,即通过sort的第三个参数,此参数是一个谓词(predicate)。

        谓词是一个可调用的表达式,其返回结果是一个能用作条件的值,即返回一个bool类型的值。标准库算法所使用的谓词分为两类:一元谓词(unary predicate,只接受单一参数)和二元谓词(binary predicate,有两个参数)。接受谓词参数的算法对输入序列中的元素调用谓词。因此,元素类型必须能转换为谓词的参数类型。

        接受一个二元谓词参数的sort版本用这个谓词代替<来比较元素。

        std::sort:对给定区间所有元素进行排序。

        std::stable_sort:对给定区间所有元素进行稳定排序,稳定排序算法能够维持相等元素的原有顺序。

        std::partial_sort:对给定区间所有元素进行部分排序。

        当容器中的元素是一些标准类型(如int、string)时,可以直接使用函数模板。但其元素是自定义类型或者需要按照其它方式排序时,需要自己来实现,有两种方法:一种是自己写比较函数,另一种是重载类型操作符”<”。std::sort/std::stable_sort/std::partial_sort中最后一个参数可以是函数指针类型或函数对象类型。

        std::sort采用类似快速排序算法,复杂度为N*log2(N);std::stable_sort采用类似归并排序,复杂度为N*log2(N);std::partial_sort采用类似堆排序,复杂度为N*log(M)。但是在cplusplus中并没有说明每种sort采用的是具体哪种排序算法。

        std::sort:Sort elements in range, Sorts the elements in the range [first,last) into ascending order. The elements are compared using operator< for the first version, and comp for the second. Equivalent elements are not guaranteed to keep their original relative order (see stable_sort).

        std::stable_sort: Sort elements preserving order of equivalents. Sorts the elements in the range[first,last) into ascending order, like sort, but stable_sort preserves the relative order of the elements with equivalent values.

        std::partial_sort:Partially sort elements in range. Rearranges the elements in the range [first,last), in such a way that the elements before middle are the smallest elements in the entire range and are sorted in ascending order, while the remaining elements are left without any specific order.

下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:

#include "sort1.hpp"
#include <iostream>
#include <algorithm> // std::sort
#include <functional> // std::greater
#include <vector>
#include <array>
#include <string>

///////////////////////////////////////////////////////////
// reference: [url]http://www.cplusplus.com/reference/algorithm/sort/[/url]
static bool myfunction(int i, int j) { return (i < j); }

static struct myclass {
bool operator() (int i, int j) { return (i < j); }
} myobject;

int test_sort_1()
{
int myints[] { 32, 71, 12, 45, 26, 80, 53, 33 };
std::vector<int> myvector(myints, myints + 8); // 32 71 12 45 26 80 53 33

// using default comparison (operator <):
std::sort(myvector.begin(), myvector.begin() + 4); //(12 32 45 71)26 80 53 33

// using function as comp
std::sort(myvector.begin() + 4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

// using object as comp
std::sort(myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80)

// print out content:
std::cout << "myvector contains:";
for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';

myvector.assign(myints, myints + 8);
std::sort(myvector.begin(), myvector.end(), std::greater<int>()); // descending is to use std::greater()
std::cout << "myvector contains:";
for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';

// use std::sort to sort an array in C++11: std::begin/std::end
std::sort(std::begin(myints), std::end(myints));
for (int i = 0; i < 8; ++i) {
std::cout << " " << myints[i];
}
std::cout << "\n";

return 0;
}

/////////////////////////////////////////////////
// reference: [url]https://www.codeproject.com/Articles/38381/STL-Sort-Comparison-Function[/url]
class Person_sort4 {
public:
// default constructor
Person_sort4() : age(0) {}
Person_sort4(int age, std::string name) {
this->age = age; this->name = name;
}
bool operator<(const Person_sort4& rhs) { // define a member < operator for the Person class
return this->age < rhs.age;
}

int age;
std::string name;
};

int test_sort_4()
{
std::vector<Person_sort4> vecPerson;
vecPerson.push_back(Person_sort4(24, "Calvin"));
vecPerson.push_back(Person_sort4(30, "Benny"));
vecPerson.push_back(Person_sort4(28, "Alison"));

std::sort(vecPerson.begin(), vecPerson.end());

for (size_t i = 0; i<vecPerson.size(); ++i)
std::cout << vecPerson[i].age << ", " << vecPerson[i].name << std::endl;

return 0;
}

/////////////////////////////////////////////////////////////////////
// reference: [url]http://www.cplusplus.com/articles/NhA0RXSz/[/url]
struct Person_sort {
// Left out making a constructor for simplicity's sake.
std::string name;
int age;
std::string favoriteColor;
};

// Sort Container by name function
static bool sortByName(const Person_sort &lhs, const Person_sort &rhs) { return lhs.name < rhs.name; }

// Sort Container by age function
static bool sortByAge(const Person_sort &lhs, const Person_sort &rhs) { return lhs.age < rhs.age; }

// Sort Container by favorite color
// We can just sort alphabetically and then it will group the color together.
static bool sortByColor(const Person_sort &lhs, const Person_sort &rhs) { return lhs.favoriteColor < rhs.favoriteColor; }

// A global const variable to hold how many people to ask for input for.
const unsigned numberOfPeople = 2;

int test_sort_2()
{
using std::vector;
using std::cout;
using std::cin;
using std::endl;
using std::sort;
using std::string;

// Make a vector that holds 5 blank Person_sort Objects
vector<Person_sort> people { { "Tom", 23, "Red" }, {"Jim", 11, "Green"} };

// This will ask for user input to populate the container
// with 5 different indivuals.
//for (vector<Person_sort>::size_type i = 0; i != numberOfPeople; ++i) {
// cout << "Person_sort #" << i + 1 << " name: ";
// cin >> people[i].name;

// cout << "Person_sort #" << i + 1 << " age: ";
// cin >> people[i].age;

// cout << "Person_sort #" << i + 1 << " favorite color: ";
// cin >> people[i].favoriteColor;
//}
//cout << "\n\n";

// Sort by name
sort(people.begin(), people.end(), sortByName);
for (Person_sort &n : people)
cout << n.name << " ";
cout << endl;

// Sory by age
sort(people.begin(), people.end(), sortByAge);
for (Person_sort &n : people)
cout << n.age << " ";
cout << endl;

// Sort by color
sort(people.begin(), people.end(), sortByColor);
for (Person_sort &n : people)
cout << n.favoriteColor << " ";
cout << endl;

return 0;
}

/////////////////////////////////////////////////////////////
// reference: [url]http://en.cppreference.com/w/cpp/algorithm/sort[/url]
int test_sort_3()
{
std::array<int, 10> s = { 5, 7, 4, 2, 8, 6, 1, 9, 0, 3 };

// sort using the default operator<
std::sort(s.begin(), s.end());
for (auto a : s) {
std::cout << a << " ";
}
std::cout << '\n';

// sort using a standard library compare function object
std::sort(s.begin(), s.end(), std::greater<int>());
for (auto a : s) {
std::cout << a << " ";
}
std::cout << '\n';

// sort using a custom function object
struct {
bool operator()(int a, int b) const {
return a < b;
}
} customLess;
std::sort(s.begin(), s.end(), customLess);
for (auto a : s) {
std::cout << a << " ";
}
std::cout << '\n';

// sort using a lambda expression
std::sort(s.begin(), s.end(), [](int a, int b) {
return b < a;
});
for (auto a : s) {
std::cout << a << " ";
}
std::cout << '\n';

return 0;
}

/////////////////////////////////////////////////////////////////////
// reference: [url]http://www.cplusplus.com/reference/algorithm/stable_sort/[/url]
static bool compare_as_ints(double i, double j)
{
return (int(i)<int(j));
}

int test_stable_sort_1()
{
double mydoubles[] { 3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58 };

std::vector<double> myvector;
myvector.assign(mydoubles, mydoubles + 8);

std::cout << "using default comparison:";
std::stable_sort(myvector.begin(), myvector.end());
for (std::vector<double>::iterator it = myvector.begin(); it != myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';

myvector.assign(mydoubles, mydoubles + 8);

std::cout << "using 'compare_as_ints' :";
std::stable_sort(myvector.begin(), myvector.end(), compare_as_ints);
for (std::vector<double>::iterator it = myvector.begin(); it != myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';

return 0;
}

/////////////////////////////////////////////////////////////////////
// reference: [url]http://en.cppreference.com/w/cpp/algorithm/stable_sort[/url]
struct Employee_sort {
Employee_sort(int age, std::string name) : age(age), name(name) { }
int age;
std::string name; // Does not particpate in comparisons
};

static bool operator<(const Employee_sort &lhs, const Employee_sort &rhs)
{
return lhs.age < rhs.age;
}

int test_stable_sort_2()
{
std::vector<Employee_sort> v = {
Employee_sort(108, "Zaphod"),
Employee_sort(32, "Arthur"),
Employee_sort(108, "Ford"),
};

std::stable_sort(v.begin(), v.end());

for (const Employee_sort &e : v) {
std::cout << e.age << ", " << e.name << '\n';
}

return 0;
}

////////////////////////////////////////////////////
// reference: [url]http://www.cplusplus.com/reference/algorithm/partial_sort/[/url]
int test_partial_sort_1()
{
int myints[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
std::vector<int> myvector(myints, myints + 9);

// using default comparison (operator <):
std::partial_sort(myvector.begin(), myvector.begin() + 5, myvector.end());

// using function as comp
std::partial_sort(myvector.begin(), myvector.begin() + 5, myvector.end(), myfunction);

// print out content:
std::cout << "myvector contains:";
for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';

return 0;

 

 

 

 

C++中std::sort/std::stable_sort/std::partial_sort的区别及使用

该用户从未签到

主题

0

回帖

0

积分

管理员

积分
0
发表于 2024-7-28 09:28:43 | 显示全部楼层
  法拉利膜材作为一种高性能的建筑材料,在建筑、汽车及广告等多个领域有着广泛的应用。以下是对法拉利膜材型号、特点及优点的详细分析:
[img]http://www.mjgou.com/data/attachment/forum/202403/13/223041uiqmeujen4jjj6zv.jpg[/img]
[b]一、法拉利膜材型号[/b]
法拉利膜材有多种型号,包括但不限于以下几种:1302 S2 Flexlight Advanced:这是一种高性能IV型柔性复合膜材,以其卓越的透光性、耐久性和易维护性而受到青睐。942、1202 S2、1002 S2、902 S2、1212 S2、912 S2:这些型号同样属于法拉利膜材系列,各自具有不同的特性和适用范围,但具体特点需根据具体型号进一步分析。需要注意的是,法拉利膜材的型号可能随着产品更新换代而有所变化,具体型号及其特性请参考最新产品资料。
[img=860,1255]http://www.mjgou.com/data/attachment/forum/202403/13/223254bbblwlbvbvsbwlsl.jpg[/img]
[b]二、法拉利膜材特点[/b]
法拉利膜材的特点主要体现在以下几个方面:
1、高强度与耐用性:法拉利膜材采用高强度材料制成,具有良好的抗拉强度和撕裂强度,能够承受较大的外力作用而不易破损。耐用性强,能够在恶劣气候条件下保持稳定的性能,延长使用寿命。
2、透光性与美观性:部分型号如1302 S2 Flexlight Advanced具有高透光性,能够在保持室内光线充足的同时,提供清晰的视野。膜材表面平整光滑,色彩丰富多样,能够满足不同建筑和装饰需求,提升整体美观性。
3、轻质与灵活性:法拉利膜材重量较轻,便于运输和安装,能够降低施工成本和时间。膜材具有一定的柔韧性,能够适应各种复杂形状和结构的设计要求。
4、环保与可回收性:法拉利膜材符合环保要求,部分材料可回收利用,减少了对环境的影响。
[img]http://www.mjgou.com/data/attachment/forum/202403/13/223128owhn0099rrds5h5y.jpg[/img]
[b]三、法拉利膜材优点[/b]
法拉利膜材的优点主要体现在以下几个方面:
1、提升建筑性能:高强度与耐用性使得法拉利膜材能够提升建筑的稳定性和安全性,延长使用寿命。透光性与美观性使得建筑内部光线充足、视野开阔,同时提升整体美观度。
2、降低施工成本:轻质特性使得运输和安装成本降低,施工效率提高。膜材的柔韧性使得施工更加灵活多变,能够适应各种复杂地形和结构要求。
3、节能环保:部分材料可回收利用,符合环保要求,减少了对环境的影响。良好的透光性能够减少室内照明需求,降低能耗。
4、广泛应用领域:
法拉利膜材不仅适用于建筑领域(如体育设施、商业设施、文化设施、交通设施等),还广泛应用于汽车及广告领域(如高档车辆贴膜保护和装饰、广告招贴等),展现出其多功能的特性。

综上所述,法拉利膜材以其高强度、耐用性、透光性、美观性、轻质灵活性以及环保可回收性等优点,在建筑、汽车及广告等多个领域发挥着重要作用。具体型号的选择应根据实际需求和应用场景进行综合考虑。
[url=http://www.mjgou.com/forum-17-1.html][size=6530][color=Red]法拉利膜材中国代理商 - 膜结构网[/color][/size][/url]
C++中std::sort/std::stable_sort/std::partial_sort的区别及使用

该用户从未签到

主题

0

回帖

2

积分

新手上路

积分
2
发表于 2024-8-6 10:42:43 | 显示全部楼层
赛德乐膜材作为一种高性能的技术织物产品,在建筑、工业等多个领域有着广泛的应用。以下是对赛德乐膜材的详细分析:
[b]一、公司背景与实力[/b]
公司性质:赛德乐是一个家族性的跨国集团公司,总部位于奥地利,拥有多个生产基地,包括位于奥地利南部城市格拉茨的Thondorf酒店大厦,以及位于奥地利Burgenland(布尔根兰州)省Rudersdorf(鲁德斯多夫)的工厂。此外,其总部还位于德国北莱茵西伐利亚省。
市场地位:作为欧洲技术织物产品的顶级制造商,赛德乐集团已成为全球性的技术织物的主要供应商。每年向全球市场提供超过两千万平方米的织布产品。
[b]二、产品特点[/b]
高性能材料:赛德乐膜材主要采用聚酯纤维等高强度材料制成,具有良好的抗拉强度和撕裂强度。在PVDF涂层上添加了特殊的改性助剂,与PVC层内添加剂协同作用,使PVDF与PVC涂层的结合更加牢固,不易剥离。
耐候性与耐久性:具有优异的耐候性,能够抵抗紫外线、高温、低温等极端天气条件的侵蚀。耐久性能强,使用寿命长,部分产品使用寿命可达10-15年,甚至更长。
自洁性能:独特的双面PVDF涂层设计,不仅提高了膜材的自洁性能,还消除了仅有一面涂层的膜材因底面吸附灰尘而产生的工程隐患。
环保与安全性:赛德乐膜材注重环保性能,部分产品可回收再利用,符合国际环保标准。具有良好的防火性能,部分产品达到B1级防火标准。
多功能性:具有防水、防潮、防污等多种功能,广泛应用于建筑、汽车、包装等多个领域。
[b]三、产品系列与型号[/b]
赛德乐膜材拥有多个系列和型号的产品,以满足不同客户的需求。常用型号包括SD1080(II)、S1200(II)、S1000(II)、S900E、S850等。这些型号在性能上略有差异,但均具备赛德乐膜材的高性能和耐用特点。
[b]四、应用领域[/b]
赛德乐膜材广泛应用于多个领域,包括但不限于:
建筑领域:作为屋顶、墙面、遮阳篷等建筑材料,提升建筑的美观性和实用性。
体育设施:如体育场、体育馆、游泳馆等,为运动员和观众提供舒适的环境。
商业设施:商场、购物中心、酒店、餐厅等商业场所的装饰和遮阳需求。
交通设施:机场、火车站、公交车站等交通枢纽的遮阳和装饰。
[b]五、技术创新与发展[/b]
赛德乐集团一直致力于技术创新和产品研发。通过引进先进的生产设备和技术,不断提升产品的质量和性能。同时,赛德乐还注重与国内外知名科研院校、膜结构公司等进行技术交流和合作,共同推动膜材行业的发展和进步。
[b]六、总结[/b]
赛德乐膜材以其高性能、耐候性、自洁性、环保性和多功能性等特点,在建筑、体育、商业等多个领域展现出广泛的应用前景。随着技术的不断进步和市场的不断发展,赛德乐膜材将继续保持其领先地位,为客户提供更加优质的产品和服务。

 

 

 

 

C++中std::sort/std::stable_sort/std::partial_sort的区别及使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-8 03:29 , Processed in 0.114166 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表