STL之使用vector排序

应用场景:

  在内存中维持一个有序的vector:

 1 // VectorSort.cpp : Defines the entry point for the console application.
 2
 3 #include <iostream>
 4 #include <vector>
 5 #include <algorithm>
 6
 7 //先自定义一个结构体
 8 struct Test {
 9     float member1;
10     std::string member2;
11
12 };
13 bool SortByM1( const Test* v1, const Test* v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致
14 {
15     return v1->member1 > v2->member1;       //降序排列
16     //return v1->member1 > v2->member1;     //升序排列
17 }
18 void PrintVector( std::vector<Test*> & vec)
19 {
20     /*
21         插一句,
22         vec.begin()对应的位置是向量的第一个位置,
23         vec.end()对应的是vector中的最后的一个元素位置的后面的一个位置(我认为,实际上是一个无效位置)
24         文档上的定义:Returns an iterator referring to the past-the-end element in the vector container.
25     */
26     for(std::vector<Test*>::iterator it = vec.begin() ; it != vec.end() ; it++ )
27     {
28         std::cout<<(*it)->member1<<‘\t‘<<(*it)->member2<<std::endl;
29     }
30 }
31
32 int main(int argc, char* argv[])
33 {
34     std::vector<Test*> vecTest;
35     std::string stt;
36     for(int i=0; i<10;++i){
37         stt = "sh" + stt;
38         Test* tmp = new Test();
39         tmp->member1 = i;
40         tmp->member2 = stt;
41         vecTest.push_back(tmp);
42     }
43
44     //排序之前
45     std::cout<<"Before Sort:"<<std::endl;
46     PrintVector(vecTest);
47
48     std::cout<<"对向量中的所有元素按member1进行升序排列:"<<std::endl;
49     std::sort(vecTest.begin(),vecTest.end(), SortByM1);
50     PrintVector(vecTest);
51
52     //std::cout<<"对向量中的第2个到第5个元素按member1进行升序排列:"<<std::endl;
53     //std::sort(vecTest.begin()+1,vecTest.begin()+5,SortByM1);//vecTest.begin()+5为第6个位置
54     //PrintVector(vecTest);
55
56     for(std::vector<Test*>::iterator it = vecTest.begin();
57         it != vecTest.end(); ++it){
58         delete *it;          #free掉内存
59     }
60
61     return 0;
62 }
63
64 [email protected]:~/cp/test# g++ vector_sort.cpp  -g -Wall
65 [email protected]:~/cp/test# ./a.out
66 Before Sort:
67 0    sh
68 1    shsh
69 2    shshsh
70 3    shshshsh
71 4    shshshshsh
72 5    shshshshshsh
73 6    shshshshshshsh
74 7    shshshshshshshsh
75 8    shshshshshshshshsh
76 9    shshshshshshshshshsh
77 对向量中的所有元素按member1进行升序排列:
78 9    shshshshshshshshshsh
79 8    shshshshshshshshsh
80 7    shshshshshshshsh
81 6    shshshshshshsh
82 5    shshshshshsh
83 4    shshshshsh
84 3    shshshsh
85 2    shshsh
86 1    shsh
87 0    sh    

[email protected]:~/cp/test# valgrind --tool=memcheck --leak-check=yes ./a.out
==24247== Memcheck, a memory error detector
==24247== Copyright (C) 2002-2011, and GNU GPL‘d, by Julian Seward et al.
==24247== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==24247== Command: ./a.out
==24247==
Before Sort:
0 sh
1 shsh
2 shshsh
3 shshshsh
4 shshshshsh
5 shshshshshsh
6 shshshshshshsh
7 shshshshshshshsh
8 shshshshshshshshsh
9 shshshshshshshshshsh
对向量中的所有元素按member1进行升序排列:
9 shshshshshshshshshsh
8 shshshshshshshshsh
7 shshshshshshshsh
6 shshshshshshsh
5 shshshshshsh
4 shshshshsh
3 shshshsh
2 shshsh
1 shsh
0 sh
==24247==
==24247== HEAP SUMMARY:
==24247== in use at exit: 0 bytes in 0 blocks
==24247== total heap usage: 25 allocs, 25 frees, 768 bytes allocated
==24247==
==24247== All heap blocks were freed -- no leaks are possible
==24247==
==24247== For counts of detected and suppressed errors, rerun with: -v
==24247== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

时间: 2024-08-10 14:57:53

STL之使用vector排序的相关文章

c++ STL中的vector与list为什么没有提供find操作?

map里有,set里也有,vector,list没有,太不公平了吧. 其实应该考虑为什么map,set里有find操作. include<algorithm>里有通用的find操作,通用的find内部是从begin到end进行一次遍历,复杂度是O(n). 通过iterator从begin到end遍历map与set时,得到的结果是按key排序的结果,而不是插入时的顺序(所以这两个容器没有push_back操作), 其实,insert到map与set中的元素会被组织到一颗红黑树上,红黑树是一颗平衡

c++中STL容器中的排序

1.c++STL中只有list自带了排序函数: (1).若list中存放的是int类型或者string类型,直接利用sort即可: list <int> list1; list1.sort(); 此时默认为升序,若要使用降序,直接自定义cmp函数即可. (2).若存放的是结构体或其他指针类型,需要自己定义比较结构体: struct student { int num;}; struct node { bool operator()(student a,student b) return a.n

C/C++解题常用STL大礼包 含vector,map,set,queue(含优先队列) ,stack的常用用法

每次忘记都去查,真难啊 1 /* 2 C/C++解题常用STL大礼包 含vector,map,set,queue(含优先队列) ,stack的常用用法 3 */ 4 5 /* 6 vector常用用法 7 */ 8 //头文件 9 #include<vector> 10 11 //常用的初始化方法 12 vector<int> v; //直接定义一个整型元素的向量 且未声明长度,其中int的位置可以换成别的数据类型或者结构体等 13 vector<int> v(10);

STL中的Vector相关用法

STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int>是一种数据类型. Vector的存储空间是连续的,list不是连续存储的. 1. 定义和初始化 vector< typeName > v1; //默认v1为空,故下面的赋值是错误的v1[0]=5;//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被

C++ vector 排序

C++ vector 排序 C++中当 vector 中的数据类型为基本类型时我们调用std::sort函数很容易实现 vector中数据成员的升序和降序排序,然而当vector中的数据类型为自定义结构体类型时,我们该怎样实现升序与降序排列呢?有两种方法,下面的例子能很好的说明:  方法1:  我们直接来看代码吧,比较简单,容易理解:   #include "stdafx.h"   #include   <vector>      #include   <algori

1016. Phone Bills (25) -vector排序(sort函数)

题目如下: A long-distance telephone company charges its customers by the following rules: Making a long-distance call costs a certain amount per minute, depending on the time of day when the call is made. When a customer starts connecting a long-distance

vector排序与查找

本示例使用比较函数,函数对象进行vector的排序与查找操作. #include <algorithm> #include <vector> using namespace std; #define MAX_NAME_LEN 32 struct Student { int no; char name[MAX_NAME_LEN]; int age; bool operator==(const Student& other) const { return no == other

初探STL容器之Vector

vector 特点: 1.可变长的动态数组 2.使用时包含头文件 #include <vector> 3.支持随机访问迭代器 ? 根据下标随机访问某个元素时间为常数 ? 在尾部添加速度很快 ? 在中间插入慢 成员函数 初始化 vector(); 初始化成空 vector(int n); 初始化成有n个元素 vector(int n, const T & val); 初始化成有n个元素, 每个元素的值都是val,类型是T vector(iterator first, iterator l

转:用STL中的vector动态开辟二维数组

用STL中的vector动态开辟二维数组 源代码:#include <iostream>#include <vector>using namespace std;int main(){ int m, //行数     n; //列数 cout << "input value for m,n:"; cin>>m>>n;  //注意下面这一行:vector<int后两个">"之间要有空格!否则会被认