补充:
vector 删除指定元素:
vec.erase(remove(vec.begin(), vec.end(), val),
vec.end());
remove()返回的是删除后的尾部迭代器,必须调用erase()显式地删除其后的元素。
erase()删除迭代器指向的元素。
eg.
vec.erase(remove(vec.begin(),vec.end(), i),vec.end());
vec.erase(find(vec.begin(),vec.end(), i));
--------------------------------------------------------------------------------------------------------------------------------------------补充
bitset
bitset所在的头文件<bitset>
命名空间std
Attention:
唯一需要注意的是,bitset<>模板类虽然重载了中括号运算符,bs[0]表示的是将该数值转换为二进制时的最末尾元素,而非首位(其意义和数组并不相同)。
std::bitset<8> bs;
//bs[0] = 1; // 0000 0001
//bs[7] = 1; // 1000 0000
初始化:
默认无参构造
初始化全部位为0
-十进制或者16进制数值
std::bitset<8> bs(7);
bs.to_string() // 0000 0111
std::bitset<8> bs(0x07);
bs.to_string() // 0000 0111
方法:
bitset的操作
成员函数 |
函数功能 |
bs.any() |
是否存在值为1的二进制位 |
bs.none() |
是否不存在值为1的二进制位 |
bs.size() |
位长,也即是非模板参数值 |
bs.count() |
值为1的个数 |
bs.test(pos) |
测试pos处的二进制位是否为1 |
bs.set() |
全部位置1 |
bs.set(pos) |
pos位处的二进制位置1 |
bs.reset() |
全部位置0 |
bs.reset(pos) |
pos位处的二进制位置0 |
bs.flip() |
全部位逐位取反 |
bs.flip(pos) |
pos处的二进制位取反 |
bs.to_ulong() |
将二进制转换为unsigned long输出 |
bs.to_string() |
将二进制转换为字符串输出 |
~bs |
按位取反 |
os << b |
将二进制位输出到os流 |
一些高级用法
首先看一个简单实例:
"1000 0000" - > 1
"1000 1000" - > 17
如何实现2进制向10进制的转换,而且二进制的表示形式是一种逆序的形式,即低位在前。
int bin2dec(const string& bin)
{
std::bitset<8> bs(string(bin.rbegin(), bin.rend()));
return bs.to_ulong();
}
这里回顾开头引用中的话,bitset的强大之处不在于表示一个二进制的数值,而是表达一种情况数,一个二进制位可以表示两种情况,两个二进制位可以表示4种状况数,3个二进制位可以表达8种状况数,等等。
--------------------------------------------------------------------------------------------------------------------------------------------补充
deque:
头文件:deque
名称空间:std
初始化:deque<数据类型> 变量名;
基本操作:
assign(beg,end) 将[beg,end)区间中的数据赋值给que。
assign(n,elem) 将n个elem的拷贝赋值给que。
at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。
back() 返回容器的最后一个元素的引用。若que为空,则该操作未定义。
begin() 传回迭代器中的第一个数据地址。
clear() 移除容器中所有数据。
empty() 判断容器是否为空。
end() 返回一个迭代器,它指向容器que的最后一个元素的下一位置。
erase(pos) 删除pos位置的数据,传回下一个数据的位置。
erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。
front() 返回容器que的第一个元素的引用。如果que为空,则该操作为空。
insert(pos,elem) 在pos位置插入一个elem拷贝,传回新数据位置
insert(pos,n,elem) 在pos(迭代器)位置插入>n个elem数据。无返回值
insert(pos,beg,end) 在pos位置插入在[beg,end)区间的数据。无返回值
max_size() 返回容器que可容纳的最多元素个数。
pop_back() 删除最后一个数据。
pop_front() 删除头部数据。
push_back(elem) 在尾部加入一个数据。
push_front(elem) 在头部插入一个数据。
rbegin() 返回一个逆序迭代器,它指向容器que的最后一个元素。
rend() 返回一个逆序迭代器,它指向容器que的第一个元素的前一个位置。
resize(num) 重新指定队列的长度。
size() 返回容器中实际数据的个数。
swap(que2) 交换容器que和que2中的所有元素。
swap(que1,que2) 交换容器que1和que2中的所有元素。