正文
*************************************************************************
//STL01联系图
第1视角=联系图
STL02线性结构
第3视角=结构清单
3.1 L线性结构line
3.1.1数组valarray
1原理,特点与头文件
原理:是指针数据类型装配成valarray数组类的线性结构.
特点:与内置数组相比,它添加了更多函数方法和更安全.
头文件:#include <valarray>
2.ADT list
2.1构造方法与大O分析
valarray<type> v //构造函数并设定容量 O(1)
valarray<type> v(n); //构造函数并设定容量 O(1)
2.2赋值方法与大O分析
2.3添加方法与大O分析
resize(size n); //重置数组容量O(1)
= //=对象赋值O(N)
2.4删除方法与大O分析
free(); //清空数组O(N)
2.5检查方法与大O分析
size(); //返回数组元素个数O(1)
2.6查找方法与大O分析
[] //下标访问O(1)
2.7排序方法与大O分析 无
2.8特有方法与大O分析
max(); //返回最大元素O(N)
min(); //返回最小元素O(N)
sum(); //返回数组元素之和O(N)
2.9结构应用典型案例
//complied with dev-c++4.99
#include <cstdlib>
#include <iostream>
#include <valarray>
using namespace std;
int main(int argc, char *argv[])
{
valarray<int> v1(10),v2(10); //构造函数测试
for(int i = 0; i < 10; ++i)
{v1[i] = i; v2[i] = i*2; }//循环赋值
cout<<"v2.size()="<<v2.size()<<endl; //size()测试
v2.resize(30); //resize()测试
cout<<"v2.size()="<<v2.size()<<endl; //size()测试
cout<<"v2.max()="<<v2.max()<<endl; //max()测试
cout<<"v2.min()="<<v2.min()<<endl; //min()测试
cout<<"v2.sum()="<<v2.sum()<<endl; //sum()测试
v1.free();v2.free(); //free()测试
system("PAUSE");
return EXIT_SUCCESS;
}
3.1.2位串bitset
1原理特点与头文件
原理:由2进制位构成的位串bitset类
特点:非常方便的使用以开关位的2进制位
头文件:#include <bitset>
2.ADT list
2.1构造方法与大O分析
bitset<n> b; //n为位长,b中所有位默认为0
bitset<n> b(u); //u为unsigned long,用u对象初始化b
bitset<n> b(s); //s为string,s对象初始化b
bitset<n> b(s,pos,n); //s为string,从s的pos位的n个字符起来初始化b
2.2赋值方法与大O分析
b.set(); //b的所有位置1
b.set(n); //b的第n位置1
b.reset(); //b的所有置0
b.reset(n); //b的第n位置0
b.flip(); //b的所有位置反
b.flip(n); //b的第n位置反
2.3添加方法与大O分析 无
2.4删除方法与大O分析 无
2.5检查方法与大O分析
b.at(n); //返回第n位的值
b.size(); //返回b中位的长度
b.count(); //返回b中值为1的个数
b.any(); //判断b任何位是否为1?
b.none(); //判断b任何位是否不为1?
b.test(n); //判断b的n位是否为1?
2.6查找方法与大O分析 无
2.7排序方法与大O分析 无
2.8特有方法与大O分析
b.to_ulong(); //b的值转换为unsigned long
b.to_string(); //b的值转换为string
outs<<b; //输出流
ins>>b; //输入流
2.9结构应用典型案例
//complied ok with vc++6.0
#include <iostream>
#include <bitset>
using namespace std;
int main(int argc, char *argv[])
{
unsigned long u=0xffff;
string s1("1111000011000011");
//测试构造函数
bitset<16> b;
bitset<16> s(s1);
bitset<16> ul1(u);
bitset<16> ul2(s1,8,8);
cout<<"b= "<<b<<endl;
cout<<"s= "<<s<<endl;
cout<<"ul1="<<ul1<<endl;
cout<<"ul2="<<ul2<<endl;
//测试检查函数
cout<<"s.any()="<<s.any()<<endl;
cout<<"s.none()="<<s.none()<<endl;
cout<<"s.count()="<<s.count()<<endl;
cout<<"s.size()="<<s.size()<<endl;
cout<<"s.test(1)="<<s.test(1)<<endl;
cout<<"s.at(1)="<<s.at(1)<<endl;
//测试位操作函数
cout<<"s.set()="<<s.set()<<endl;
cout<<"s.set(1)="<<s.set(1)<<endl;
cout<<"s.reset()="<<s.reset()<<endl;
cout<<"s.reset(1)="<<s.reset(1)<<endl;
cout<<"s.flip()="<<s.flip()<<endl;
cout<<"s.flip(1)="<<s.flip(1)<<endl;
//测试转换函数
cout<<"ul1.to_ulong()="<<ul1.to_ulong()<<endl;
//cout<<"ul1.to_string="<<ul1.to_string()<<endl;
return 0;
}
3.1.3字符char
1C风格char字符串函数
头文件:c风格"string.h" c++风格<string>
char* strcpy(char*p, const char*q); //q复制并替换p
char* strcat(char*p, const char*q); //q附加到p后面
int strcmp(const char*p, const char*q);//比较p,q,p<q返回值<0,p==q返回值=0,p>q返回值>0
size_t strlen(const char*p); //q的长度
2C风格char字符分类函数
头文件:c风格"ctype.h" c++风格<cctype>
int isalpha(int); //是字母?
int isupper(int); //是大写字母?
int islower(int); //是小写字母?
int isdigit(int); //是10进制数字?
int isxdigit(int); //是16进制数字?
int isspace(int); //是空格符?
int isalnum(int); //是数字或者字母?
int isprint(int); //是打印字符?
int isgraph(int); //是图形符号?
int iscntrl(int); //是控制符?
int toupper(int); //转换为大写
int tolower(int); //转换为小写
3C风格结构应用典型案例
//filename demo.c
#include <ctype.h>
#include <string.h>
void ctypetest();
void stringtest();
int main()
{
ctypetest();
stringtest();
return 0;
}
void ctypetest()
{
int temp,ii;
int isalpha_cnt=0;
int isupper_cnt=0;
int islower_cnt=0;
int isdigit_cnt=0;
int isxdigit_cnt=0;
int isspace_cnt=0;
int isalnum_cnt=0;
int isprint_cnt=0;
int isgraph_cnt=0;
int iscntrl_cnt=0;
for (ii=0;ii<128;ii++){
temp=ii;
if isalpha(temp) isalpha_cnt++;
if isupper(temp) isupper_cnt++;
if islower(temp) islower_cnt++;
if isdigit(temp) isdigit_cnt++;
if isxdigit(temp) isxdigit_cnt++;
if isspace(temp) isspace_cnt++;
if isalnum(temp) isalnum_cnt++;
if isprint(temp) isprint_cnt++;
if isgraph(temp) isgraph_cnt++;
if iscntrl(temp) iscntrl_cnt++;
}
printf("isalpha(0-127)=%d /n",isalpha_cnt);
printf("isupper(0-127)=%d /n",isupper_cnt);
printf("islower(0-127)=%d /n",isupper_cnt);
printf("isdigit(0-127)=%d /n",isupper_cnt);
printf("isxdigit(0-127)=%d /n",isxdigit_cnt);
printf("isspace(0-127)=%d /n",isspace_cnt);
printf("isalnum(0-127)=%d /n",isalnum_cnt);
printf("isprint(0-127)=%d /n",isprint_cnt);
printf("isgraph(0-127)=%d /n",isgraph_cnt);
printf("iscntrl(0-127)=%d /n",iscntrl_cnt);
}
void stringtest(){
char c1[12]="hello";
char c2[6]="test/0";
printf("c1=%s /n",c1);
printf("c2=%s /n",c2);
printf("strcpy(c1,c2)=%s /n",strcpy(c1,c2));
printf("strcat(c1,c2)=%s /n",strcat(c1,c2));
printf("strcmp(c1,c2)=%d /n",strcmp(c1,c2));
printf("strlen(c1)=%d /n",strlen(c1));
}
3.1.4字符串string
1原理,特点与头文件
string不是C/C++内置的字符串,而是一个字符串类
2ADT list
2.1构造方法与大O分析
string(string& _string)
string(string& s)
string(char* s, int n,)
string(int n, char c,)
string& operator=(char* s)
string& operator=(char c)
~string()
2.2赋值方法与大O分析
string& assign( string& x)
string& assign( string& s, int pos, int n)
string& assign( char* s, int n)
string& assign( char* s)
string& assign(int n, char c)
2.3插入与添加方法和大O分析
string& insert(int pos, string& s)
string& insert(int pos, string& s, int pos2, int n)
string& insert(int pos, char* s, int n)
string& insert(int pos, char* s)
string& insert(int pos, int n, char c)
string& operator+=( string& s)
string& operator+=( char* s)
string& operator+=(char c)
string& append(string& s)
string& append(string& s, int pos, int n)
string& append(char* s, int n)
string& append(char* s)
string& append(int n, char c)
2.4删除方法与大O分析
string& erase(int pos, int n = pos)
iterator erase(iterator position)
iterator erase(iterator first, iterator last)
2.5替换方法与大O分析
string& replace(int pos, int n1,string& s)
string& replace(int pos, int n1,string& s, int pos2, int n2)
string& replace(int pos, int n1,char* s, int n2)
string& replace(int pos, int n1,char* s)
string& replace(int pos, int n1, int n2, char c)
string& replace(iterator i1, iterator i2,string& s)
string& replace(iterator i1, iterator i2,char* s, int n)
string& replace(iterator i1, iterator i2,char* s)
string& replace(iterator i1, iterator i2,int n, char c)
2.6查找方法与大O分析
int find(string& s, int pos)
int find(char* s, int pos, int n)
int find(char* s, int pos)
int rfind(string& s, int pos = pos)
int rfind(char* s, int pos, int n)
int rfind(char* s, int pos = pos)
int find_first_of(string& s, int pos)
int find_first_of(char* s, int pos, int n)
int find_first_of(char* s, int pos)
int find_last_of(char* s, int pos, int n)
int find_last_of(char* s, int pos = pos)
int find_first_not_of(string& s, int pos)
int find_first_not_of(char* s, int pos, int n)
int find_first_not_of(char* s, int pos)
int find_last_not_of(string& s, int pos = pos)
int find_last_not_of(char* s, int pos, int n)
int find_last_not_of(char* s, int pos = pos)
2.7迭代器与大O分析
iterator begin()
iterator end()
reverse_iterator rbegin()
reverse_iterator rend()
2.8特有方法与大O分析
void resize(int n, char c)
void resize(int n)
void clear()
reference operator[](int pos)
void push_back(char c)
int copy(char* s, int n, int pos)
void swap(string& x)
string substr(int pos, int n = pos)
int compare(string& s)
int compare(char* s)
int compare(int pos, int n1, char* s)
int compare(int pos, int n1, string& s)
int compare(int pos, int n1, string& s,int pos2, int n2)
2.9结构应用典型案例
3.1.4堆heap
1原理,特点与头文件
堆是一种非常快速的结构,它由动态数组构成.
#include <bits/stl_heap.h>
using std::push_heap; //添加
using std::pop_heap; //删除
using std::make_heap; //生成堆
using std::sort_heap; //排序堆
2ADT list
2.1不带排序标记的方法与大O分析
void push_heap(First,Last);
void pop_heap( First,Last);
void make_heap(First,Last);
void sort_heap(First,Last);
2.2不带排序标记的方法与大O分析
void push_heap(First,Last,Compare flag);
void pop_heap( First,Last,Compare flag);
void make_heap(First,Last,Compare flag);
void sort_heap(First,Last, Compare flag);
3结构应用典型案例