1、STL容器
容器是用來保存其它對象的對象。被保存的對象稱為容器的元素。容器一般實現為模板類。
容器為元素分配存儲空間,並提供元素訪問方法。
stack,queue 和 priority_queue被實現為“容器適配器”。容器適配器並不是一個獨立的容器,只是提供特定接口,而其內部使用其它容器來實現。
STL提供了以下容器模板類
1.1、順序容器
vector:向量
deque:雙向隊列
list:鏈表
1.2、容器適配器
stack:棧,先進後出(LIFO)
queue:隊列,先進先出(FIFO)
priority_queue:優先級隊列
1.3、聯合容器
set:集合
multiset:多鍵集合
map:映射
multimap:多鍵映射
bitset:位集
2、bitset
前面總體介紹了一些關於STL容器的知識,下面將對bitset進行詳細介紹。
2.1、頭文件、名字空間和bitset聲明
[cpp]
#include <bitset>
using std::bitset;
bitset聲明:
[cpp]
template < size_t N > class bitset;
2.2、構造函數
[cpp] view plaincopyprint?
bitset ( );
bitset ( unsigned long val );
template<class charT, class traits, class Allocator>
explicit bitset ( const basic_string<charT,traits,Allocator>& str,
typename basic_string<charT,traits,Allocator>::size_type pos = 0,
typename basic_string<charT,traits,Allocator>::size_type n =
basic_string<charT,traits,Allocator>::npos);
bitset<N>::bitset () 實例化一個具有N位的位集,每位均設為0。
bitset<N>::bitset (unsigned long val) 實例化一個具有N位的位集,位集使用無符號長整型val初始化位集。val的低位對應位集的低位。如果N大於val占用的位數,則多出的高位使用0初始化,低位使用val初始化。如果N小於val占用的位數,則使用val的低N位初始化位集。
第三個構造函數使用二進制字符串str初始化位集。開始於str[pos],使用字符串的n位。如果不指定參數n,則使用到字符串尾。值得注意的一點是,字符串的高位初始化位集的低位。如果用於初始化的字符串子串的長度大於位集位數N,則使用字符串子串的低N字節進行初始化。如果用於初始化的字符串子串的長度小於位集位數N,則使用字符串子串初始化位集的低位,超出位數使用0初始化。
示例代碼:
[cpp]
// 32位機上,sizeof (unsigned long) = 4,即32位
// 使用無符號整數初始化位集
unsigned long n = 0xf0f0ff00;
bitset<32> bits1 (n); //位集從高到低:11110000111100001111111100000000
bitset<16> bits2 (n); //位集從高到低:1111111100000000
bitset<40> bits3 (n); //位集從高到低:0000000011110000111100001111111100000000
// 使用字符串初始化位集
string str = "1111111100000000";
bitset<16> strbits1 (str); //位集從高到低:1111111100000000
bitset<10> strbits2 (str); //位集從高到低:1111111100
bitset<20> strbits3 (str); //位集從高到低:00001111111100000000
// 如果使用非二進制串初始化會怎樣?
bitset<32> bits (-1); // 會把負數轉換為相應的正數來初始化。此處相當於使用0xffffffff初始化。
// 如果使用負整數初始化會怎樣?
bitset<32> strbits (string("01abc10")); // 運行時報錯
2.3 運算符
[cpp]
bitset<N>& operator&= (const bitset<N>& rhs);
bitset<N>& operator|= (const bitset<N>& rhs);
bitset<N>& operator^= (const bitset<N>& rhs);
bitset<N>& operator<<= (size_t pos);
bitset<N>& operator>>= (size_t pos);
bitset<N> operator~() const;
bitset<N> operator<<(size_t pos) const;
bitset<N> operator>>(size_t pos) const;
bool operator== (const bitset<N>& rhs) const;
bool operator!= (const bitset<N>& rhs) const;
// *** global functions: ***
template<size_t N>
bitset<N> operator& (const bitset<N>& lhs, const bitset<N>& rhs);
template<size_t N>
bitset<N> operator| (const bitset<N>& lhs, const bitset<N>& rhs);
template<size_t N>
bitset<N> operator^ (const bitset<N>& lhs, const bitset<N>& rhs);
// *** iostream global functions (extraction/insertion): ***
template<class charT, class traits, size_t N>
basic_istream<charT, traits>&
operator>> (basic_istream<charT,traits>& is, bitset<N>& rhs);
template<class charT, class traits, size_t N>
basic_ostream<charT, traits>&
operator<< (basic_ostream<charT,traits>& os, bitset<N>& rhs);
// *** bit access ***
<pre name="code" class="cpp"><pre>bool operator[] ( size_t pos ) const;
reference operator[] ( size_t pos );
2.4、位操作函數
函數 說明
set () 位集置為全1
set (n) 第n位置為1
reset () 位集置為全0
reset (n) 第n位置為0
flip () 位集翻轉
2.5、位集操作函數
函數 說明
to_string 位集轉換為字符串
to_ulong 位集轉換為無符號整數。如果位集size大於ulong的位數,則捨棄位集高位。
count 返回位集中1的個數
size 返回位集的容量
any 如果位集中有1,則返回true
none 如果位集中沒有1,則返回true
test (n) 如果第n位為1,則返回true