C STL set快速初始化實現去重

2021-09-26 03:53:18 字數 1644 閱讀 3959

在python裡想去重,set()一下就好了。

c++裡其實也有類似的辦法。

結合這篇《c++ stl vector初始化》,基本能回溯python裡面任意使用list+set的自由度。

建構函式過載型別很多,我只推薦乙個。

(_iter &left , _iter &right),左閉右開。

這個_iter型別很寬泛,可以是......

①陣列位址

int a = ;

sets(a,a+5);

②迭代器

vectorv=;

sets(v.begin(),v.end());

void insert(_iter)(_iter _first, _iter _last)

如果是預先宣告好的set,可以採用insert。

使用方法基本同建構函式。

①陣列位址

sets;

int a = ;

s.insert(a,a+5);

②迭代器

注意,跟順序容器vector不同,set的insert不需要指定插入位置。

sets;

vectorv=;

s.insert(v.begin(),v.end());  //如果是vector的話,第乙個引數會是插入位置。

當然了,直接使用initializer_list<>也是可以的。

setsss = ;

std::copy(_init _first, _init _last, _outit _dest)

copy又是乙個更泛用的stl函式,需要指定插入位置(最後乙個引數)。

#include

sets;

vectorv=;

copy(v.begin(), v.end(), std::inserter(s,s.end()));

#define _crt_secure_no_warnings

#include #include #include #include settest(const set&a, const set&b) ;

總結一下,從需求出發

我有一串資料想去重。

①構造set

如果是從外部讀入的,先存到陣列a或者vector裡

然後使用建構函式(a,a+n),或者insert(a,a+n),

或者建構函式(v.begin(),v.end()),或者insert(v.begin(),v.end())

②set還原到vector

//copy函式是memset級別的,不用擔心效率問題

v.clear();

copy(s.begin(),s.end(),std::back_inserter(v));

③如果有多組資料,則分別用上述手法,初始化到集合a,b,c內。

然後對按需求abc求交並補。 

快速初始化記憶體 2

因為我們使用靜態庫鏈結,intel版本在 中是乙個函式呼叫。跟蹤進入,可以發現intel的實現在第一次呼叫時會先檢測cpu型別,然後根據cpu型別跳轉到不同的實現。在p4 機器上,其主迴圈如下 00401a40subecx,80h 00401a46movdqaxmmword ptr edx xmm0...

初始化 指定初始化

id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...

初始化 1 預設初始化 列表初始化

初始化的基本概念 事實 初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。列表初始化 p39 作為c 11新標準的一部分,用花括號 來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。現在,無論是初始化物件還是某...