1. 程式人生 > >C++中,結構體vector使用sort排序

C++中,結構體vector使用sort排序

一、遇到問題:

今天寫程式碼的是遇到想對vector進行排序的問題,隱約記得std::sort函式是可以對vector進行排序的,但是這次需要排序的vector中壓的是自己定義的結構體(元素大於等於2),想以其中某一個元素進行正序或逆序排序,則不能直接使用sort函式。

二、解決方案:

1.

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

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

int main () {
  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';

  return 0;
}
輸出為:
myvector contains: 12 26 32 33 45 53 71 80


2.然而當vector中的資料型別為自定義結構體型別時,我們該怎樣實現排序?
其實就是對上面程式碼中std::sort函式的第三個引數comp呼叫的函式或object進行修改即可。在這裡我們使用函式作為comp作為例子,程式碼如下:
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

struct Point2
{
	int x;
	int y;
};
bool GreaterSort (Point2 a,Point2 b) { return (a.x>b.x); }
bool LessSort (Point2 a,Point2 b) { return (a.x<b.x); }
int main()
{
	vector<Point2> aaa;
	Point2 temp;
	temp.x=1;
	temp.y=1;
	aaa.push_back(temp);
	temp.x=2;
	temp.y=2;
	aaa.push_back(temp);	
	temp.x=3;
	temp.y=3;
	aaa.push_back(temp);
	sort(aaa.begin(),aaa.end(),GreaterSort);//降序排列
	cout<<"Greater Sort:"<<endl;
	for (int i =0;i<aaa.size();i++)
	{
		cout<<aaa[i].x<<"	"<<aaa[i].y<<endl;
	}

	sort(aaa.begin(),aaa.end(),LessSort);//升序排列
	cout<<"Less Sort:"<<endl;
	for (int i =0;i<aaa.size();i++)
	{
		cout<<aaa[i].x<<"	"<<aaa[i].y<<endl;
	}

	return 1;
}
執行結果如下:
Greater Sort:
3       3
2       2
1       1
Less Sort:
1       1
2       2
3       3

以上程式碼在visual stdio 2012環境下編譯通過,也是自己在實踐過程中的總結,如有不妥的地方,歡迎您指出。

三、參考文獻:



相關推薦

c++結構sort()排序

double struct def str tro c++ style average span //添加函數頭 #include <algorithm> //定義結構體Yoy typedef struct { double totalprice; double

C++,結構vector使用sort排序

一、遇到問題: 今天寫程式碼的是遇到想對vector進行排序的問題,隱約記得std::sort函式是可以對vector進行排序的,但是這次需要排序的vector中壓的是自己定義的結構體(元素大於等於2

淺談c++結構和共用的區別

ont 基本類型 erl list 變量名 ext 使用結構體 oot 數據格式 在c++中,結構體(struct)和共用體(union)是兩種很相似的復合數據類型,都可以用來存儲多種數據類型,但是兩者還有很大的區別。 結構體(struct) 結構是用戶自定

C#結構定義並轉換位元組陣列 C#結構定義並轉換位元組陣列

ref: https://www.cnblogs.com/dafanjoy/p/7818126.html C#中結構體定義並轉換位元組陣列          最近的專案在做socket通訊報文解析的時候,用到了結構體與位元組陣列的轉換

C#結構與位元組流互相轉換

C++的訊息結構體如下 struct cs_message{ u32_t cmd_type; char username[16]; u32_t dstID; u32_t

C++結構的對齊方式

在面試中,常會考到結構體的對齊方式,因此對其進行總結。 1、在沒有#pragma pack巨集的情況下     struct sA{ double d1; int i1; double d2; char c1;

C++結構與類的區別(struct與class的區別)

C++中的struct對C中的struct進行了擴充,它已經不再只是一個包含不同資料型別的資料結構了,它已經獲取了太多的功能。struct能包含成員函式嗎? 能! struct能繼承嗎? 能!! struct能實現多型嗎? 能!!!  既然這些它都能實現,那它和clas

C#結構和類區別和聯絡

結構體 結構體定義 結構體是一種值型別,通常用來封裝小型相關變數組。例如座標或者商品的特徵。 結構體是一種自定義的資料型別,相當於一個複合容器,可以儲存多種型別。 結構體由結構體成員構成,結構體成員包含欄位,屬性與方法 結構體建

C#結構與類的區分

在類的使用過程中,既不需要很多方法,也不需要從類中繼承,為了提升效能,可以使用結構體來替代類。 與類不同的是,結構體用struct 修飾;結構體中的例項欄位不能自定義預設值,而類可以,編譯器會隱式的給出結構體和類的預設建構函式,但是結構體的預設構造不能顯示給出,不然編譯器會

C#結構和類的區別

結構體和類同樣能夠定義欄位,方法和建構函式,都能例項化物件,這樣看來結構體和類的功能好像是一樣的了,但是他們在資料的儲存上是不一樣的C#結構體和類的區別問題:這兩種資料型別的本質區別主要是各自指向的記憶體位置不同。傳遞類的時候,主要表現為是否同時改變了源物件。1.結構體是值型

C++結構與類的區別

學習了C++的面向物件,最常見的和寫的就是類結構體,下面主要介紹一下結構體和類的區別。 首先類是C++中面向物件獨有的,但是C和C++中都有結構體,下面我們來看一下C和C++中結構體的區別。這裡主要從封裝、多型、繼承、封裝和訪問許可權幾個方面來說。1、C和C++中結構體的區

【知識積累】C#結構和類的區別

【類】     類是對現實生活中一類具有共同特徵的事物的抽象。類的實質是一種資料型別,類似於int、char等基本型別,不同的是它是一種複雜的資料型別。因為它的本質是型別,而不是資料,所以不存

C/C++結構(struct)

c++ 裡面struct可以new,另外:C++中,struct關鍵字與Class關鍵字基本是一樣的,但是,有兩點不同 1 struct定義的資料型別裡面所有成員預設級別都是共有的,而class裡面所有成員預設級別都是私有的 2 在模板定義中,只能用class 或者

C結構的儲存分配

對於C語言中結構體所佔的儲存空間的大小,也一直是筆試面試的常客,今天好好看了一下這方面,以前一直以為很清楚了,今天通過各種實際測試舉例,發現原來還是沒有搞透徹,好在現在是徹底懂了,所以和大家分享,希望能有所幫助。提到結構體,相信大家都知道元素儲存要對齊,話是沒有錯,只是這個“對齊”裡面包含了很多微妙的東西。

C++結構的解構函式和建構函式

在C++中除了類中可以有建構函式和解構函式外,結構體中也可以包含建構函式和解構函式,這是因為結構體和類基 本雷同,唯一區別是,類中成員變數預設為私有,而結構體中則為公有。注意,C++中的結構體是可以有解構函式和構造 函數,而C則不允許。至於聯合體,它是不可能有解構函式和建構

C\C++結構變數與結構指標記憶體分配問題

宣告一個結構體變數,無論是否初始化,都開闢記憶體,宣告一個結構體指標變數,對其初始化的時候才會開闢記憶體。 A a[3];  a是A型的,有3個,當然分配A乘3大小的空間 A* a;    a是A*型的,當然只分配A*大小的空間,而不會分配A大小的空間好像跟你說的不太一樣,

c++結構作為函式引數的使用

結構體雖然和陣列一樣,都可以儲存多個數據項,但是在涉及到函式時,結構變數的行為更接近於一個基本的單值變數,也就是說,與陣列不同,結構將其資料組合成單個實體或資料物件,該實體被視為一個整體。函式中引數為

C/C++結構記憶體分配問題

有人問起當一個結構體裡面只有一個char型元素的時候,為什麼這個型別的變數也佔了四個位元組呢.下面我們來看一下: 對於一個結構體,裡面的元素排列順序不同,那麼分配的空間也會不同. 我們在VC6.0下看如下結構體: struct test{    char    item1; 

C++結構的位元組對齊問題

  前不久,在C++程式中碰到一個有關結構體位元組對齊的問題。 一。問題描述 在程式中,定義了一個結構體,如下:typedef struct{   char name[33];   int ID;   int  age;} PERSON; 聲明瞭一個該結構體的陣列:PERSO

C/C++結構佔用記憶體大小的計算方法

引言 結構體在C語言中雖然經常使用,但是怎麼計算一個結構體佔用多大的記憶體,很多C語言的新手都沒注意過,其實C語言的語法簡單,難就難在它更偏向於與底層,與記憶體打交道。對於嵌入式方面來說,對C語言的要求更高,因為有些硬體的記憶體並不像我們使用的電腦的記憶體那麼充裕,所以需