迭代讀取被封裝的使用者列表並更新的一種方法

2021-10-20 18:40:58 字數 2541 閱讀 5206

設計乙個位於訊息收聽端和訊息廣播端的使用者列表,用來存放所有已連線客戶的socket,並且根據send()情況對該列表進行更新,同時,廣播時也應該遮蔽該條訊息的**客戶。

為了記載使用者的套接字及其位址資訊,採用std::map的容器建立對映。為了封裝這麼乙個容器,我寫了乙個簡單的類。

由於在廣播過程中需要迭代獲取每一位當前使用者,所以需要為這個類設計乙個迭代介面。

class

cclientinfo

;

為什麼需要兩種刪除使用者的函式,這是因為在接收端也可以根據recv()的返回結果,判定一名已知使用者已經斷開連線。此時也可以呼叫刪除使用者的函式,屬於在非迭代過程中刪除

而在廣播端,由於廣播的過程是依靠迭代實現,所以此時根據send()結果刪除已掉線客戶,屬於在迭代過程中刪除

重點比較兩種不同的刪除介面的設計方法,需要注意的點是,如何避免迭代器因為不適當的擦除過程而失效。迭代器失效會導致迭代出錯。

另乙個前提是,我為需要用到該迭代方法的類中設計了乙個迭代器成員,通過引用傳值,將迭代器送入介面,介面修改迭代器使迭代器指向某一元素。

bool cclientinfo::

iter

(std::map

::iterator& it)

}else

return in_iter;

}

void cclientinfo::

toss

(socket& s, std::map

::iterator& it)

else

map.

erase

(s);

}void cclientinfo::

toss

(socket& s)

注意需要自己宣告乙個迭代器用於傳入

std::map

::iterator it;

將產品庫宣告再全域性中,方便不同的類直接訪問

cclientinfo cinfo
(實際上在實踐過程中,我出現了重複宣告的問題,無法用extern解決,目前尚不清楚原因,最後用到了__declspec(selectany)語句來宣告變數,這在官方的文件裡是不被推薦的。)

迭代過程如下:

...

while

(cinfo.

iter

(it)

)}

由於目前客戶端還不成熟,所以我將該方法複製到了乙個簡單的測試例子中,進行測試。

#include

#include

using

namespace std;

class

mymap

void

put(

int& i,

char

& c)

void

toss

(int

& i, map<

int,

char

>

::iterator& it)

else

m.erase

(i);

}void

toss

(int

& i)

bool

iter

(map<

int,

char

>

::iterator& it)

}else

return in_iter;}}

;

首先將物件宣告在全域性中,然後再主函式中給產品庫中傳值若干次。隨後進行一次迭代過程,展示迭代效果,最後進行迭代中刪除元素的測試。

mymap m;

intmain()

while

(m.iter

(it)

)else

}return0;

}

第二次迭代的預期輸出結果應為從'b''d',因為首位元素應被刪除。

若將第二次迭代中擦除條件改為'd',應輸出'a''c'

太好啦!

python讀取列表中的元素並插入MySQL資料庫

列表的資料項不需要具有相同的型別 list 1,2,3,4,5,6,7 print list 1 5 輸出結果為 2,3,4,5 python讀取列表中的元素並插入mysql資料庫 coding utf 8 import pymysql list 20,5,wangyan connent pymys...

自己封裝的乙個模擬下拉列表的外掛程式

簡述 通過使用simselect 可以實現由傳統 html 模擬類似於原生 select 標籤的功能。主要是解決select 標籤樣式在不同瀏覽器中的相容性問題。通過模擬,使用者便可以完全自定義下拉列表的樣式。該工具主要有以下幾種功能 結構 通過使用simselect 可以在指定的 dom物件內生成...

Android中乙個動態更新時間並顯示的小例子

這是乙個利用執行緒和handler配合更新時間的小例子 1.主activity public class testtimechangedactivity extends activity 控制時間更新的執行緒 private class timethread extends thread 實際更新時...