正在加载
请稍等

菜单

红楼飞雪 梦

15526773247

文章

Home C++ C++标准库 vector排序
Home C++ C++标准库 vector排序

C++标准库 vector排序

C++ by

前天要做一个对C++ STL的vector容器做一个排序操作,之前一直把vector当做一个容量可自动变化的数组,是的,数组,所以打算按照对数组进行排序的方法:用快速排序或是冒泡排序等算法自己写一个排序的函数。后来觉得STL这么强大,应该有它自己的排序方法(没有好好学习啊),然后就去google了一下,果然有,而且可以自定义排序的函数,太强大了(而且效率应该比我自己写的要好吧)。

  1. // VectorSort.cpp : Defines the entry point for the console application.
  2. //
  3. #include “stdafx.h”
  4. #include <iostream>
  5. #include <vector>
  6. #include <algorithm>
  7. //先自定义一个结构体
  8. struct Test {
  9.     int member1;
  10.     int member2;
  11. };
  12. //自定义排序函数
  13. bool SortByM1( const Test &v1, const Test &v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致
  14. {
  15.     return v1.member1 < v2.member1;//升序排列
  16. }
  17. void MyPushback(std::vector<Test> & vecTest, const int &m1, const int &m2)
  18. {
  19.     Test test;
  20.     test.member1 = m1;
  21.     test.member2 = m2;
  22.     vecTest.push_back(test);
  23. }
  24. void PrintVector( std::vector<Test> & vec)
  25. {
  26.     /*
  27.         插一句,
  28.         vec.begin()对应的位置是向量的第一个位置,
  29.         vec.end()对应的是vector中的最后的一个元素位置的后面的一个位置(我认为,实际上是一个无效位置)
  30.         文档上的定义:Returns an iterator referring to the past-the-end element in the vector container.
  31.     */
  32.     for(std::vector<Test>::iterator it = vec.begin() ; it != vec.end() ; it++ )
  33.     {
  34.         std::cout<<it->member1<<‘\t’<<it->member2<<std::endl;
  35.     }
  36. }
  37. int _tmain(int argc, _TCHAR* argv[])
  38. {
  39.     std::vector<Test> vecTest;
  40.     MyPushback(vecTest,9,1);
  41.     MyPushback(vecTest,8,2);
  42.     MyPushback(vecTest,7,3);
  43.     MyPushback(vecTest,6,4);
  44.     MyPushback(vecTest,5,5);
  45.     MyPushback(vecTest,4,6);
  46.     MyPushback(vecTest,3,7);
  47.     MyPushback(vecTest,2,8);
  48.     MyPushback(vecTest,1,9);
  49.     //排序之前
  50.     std::cout<<“Before Sort:”<<std::endl;
  51.     PrintVector(vecTest);
  52.     std::cout<<“对向量中的所有元素按member1进行升序排列:”<<std::endl;
  53.     std::sort(vecTest.begin(),vecTest.end(),SortByM1);
  54.     PrintVector(vecTest);
  55.     //std::cout<<“对向量中的第2个到第5个元素按member1进行升序排列:”<<std::endl;
  56.     //std::sort(vecTest.begin()+1,vecTest.begin()+5,SortByM1);//vecTest.begin()+5为第6个位置
  57.     //PrintVector(vecTest);
  58.     return 0;
  59. }
// VectorSort.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>

//先自定义一个结构体
struct Test {
    int member1;
    int member2;
};

//自定义排序函数
bool SortByM1( const Test &v1, const Test &v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致
{
    return v1.member1 < v2.member1;//升序排列
}

void MyPushback(std::vector<Test> & vecTest, const int &m1, const int &m2)
{
    Test test;
    test.member1 = m1;
    test.member2 = m2;
    vecTest.push_back(test);
}

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 _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Test> vecTest;
    MyPushback(vecTest,9,1);
    MyPushback(vecTest,8,2);
    MyPushback(vecTest,7,3);
    MyPushback(vecTest,6,4);
    MyPushback(vecTest,5,5);
    MyPushback(vecTest,4,6);
    MyPushback(vecTest,3,7);
    MyPushback(vecTest,2,8);
    MyPushback(vecTest,1,9);
    //排序之前
    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);

    return 0;
}

 

10 2015-04

 

我要 分享

 

 

本文 作者

 

相关 文章