您的位置:首页 > 其它

STL之使用vector排序

2015-07-08 18:53 537 查看
应用场景:

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

// VectorSort.cpp : Defines the entry point for the console application.

#include <iostream>
#include <vector>
#include <algorithm>

//先自定义一个结构体
struct Test {
float member1;
std::string member2;

};
bool SortByM1( const Test* v1, const Test* v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致
{
return v1->member1 > v2->member1;       //降序排列
//return v1->member1 > v2->member1;     //升序排列
}
void PrintVector( std::vector<Test*> & vec)
{
/*
插一句,
vec.begin()对应的位置是向量的第一个位置,
vec.end()对应的是vector中的最后的一个元素位置的后面的一个位置(我认为,实际上是一个无效位置)
文档上的定义:Returns an iterator referring to the past-the-end element in the vector container.
*/
for(std::vector<Test*>::iterator it = vec.begin() ; it != vec.end() ; it++ )
{
std::cout<<(*it)->member1<<'\t'<<(*it)->member2<<std::endl;
}
}

int main(int argc, char* argv[])
{
std::vector<Test*> vecTest;
std::string stt;
for(int i=0; i<10;++i){
stt = "sh" + stt;
Test* tmp = new Test();
tmp->member1 = i;
tmp->member2 = stt;
vecTest.push_back(tmp);
}

//排序之前
std::cout<<"Before Sort:"<<std::endl;
PrintVector(vecTest);

std::cout<<"对向量中的所有元素按member1进行升序排列:"<<std::endl;
std::sort(vecTest.begin(),vecTest.end(), SortByM1);
PrintVector(vecTest);

//std::cout<<"对向量中的第2个到第5个元素按member1进行升序排列:"<<std::endl;
//std::sort(vecTest.begin()+1,vecTest.begin()+5,SortByM1);//vecTest.begin()+5为第6个位置
//PrintVector(vecTest);

for(std::vector<Test*>::iterator it = vecTest.begin();
it != vecTest.end(); ++it){
delete *it;          #free掉内存
}

return 0;
}

root@u18:~/cp/test# g++ vector_sort.cpp  -g -Wall
root@u18:~/cp/test# ./a.out
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


root@u18:~/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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: