第三章:标准库类型:string、 vector 和 bitset类型

来源:互联网 发布:中学生网络安全教育 编辑:程序博客网 时间:2024/04/29 10:10

C++中的类型:

       基本数据类型(内置):   参考:(  http://blog.csdn.net/phunxm/article/details/5071772 )

               bool,  char,  wchar_t,  short,  int,  long,  float,  double,  long double;

       抽象数据类型标准库:      参考:( http://blog.csdn.net/xiaoyecanfeng/article/details/7347303 )

              string,  vector,  bitset.

string类型:

        有6个构造函数。常用的4个:

            string s1; // 默认构造函数,s1 空串

            string s2(s1); // s2 初始化为 s1 的一个副本

            string s3(" value "); // s3 初始化为一个字符串字面值

            string s4(n,'c'); // s4初始化为字符 ‘c’ 的 n 个副本

        其对象有32个操作。常用的有:

        cin>>str, getline(cin,str)    //读入值          s.empty()     // 空串返回 true, 否则返回 else        s.size()      // 返回字符个数              s[n]        s1 + s2        // 返回新生        s1 = s2     // s1 内容替换为 s2副本:释放s1内存,再分配给s1足够内存,复制 s2内容到新分配内存。        v1 == v2      // 相等返回 true,否则返回 false        !=, <, <=     //保持惯有含义        > 和 >=                                               ( s1+=s2      // equivalent to s1=s1+s2; )
     *: 当string对象和字符串字面值混合连接操作时,+操作符的操作数至少有一个是string类型的。  // +不能连接两个指针。

      string 对象中字符的处理:  头文件<cctype>中定义的函数:      

            *  isalnum(c)     // c 为字母或数字,则 true            *  isalpha(c)     //  c 为字母,true               iscntrl(c)   //控制字符,true            *  isdigit(c)   //数字,true                                               isgraph(c)      // c 不是空格,但可打印,则 true            *  islower(c)            *  isupper(c)               isprint(c)    // 可打印,则 true            *  ispunct(c)      //标点符号, true  ( punctuation )               isspace(c)     //空白字符, true               isxdigit(c)     //十六进制数,true            *  tolower(c)            *  toupper(c)      // 返回大写 c

     try coding:

string st,result_st;getline(cin,st);for(string::size_type index=0;index<st.size();++index){if(!(ispunct(st[index]) || isspace(st[index])))result_st+=tolower(st[index]);}cout<<result_st<<endl;
     

vector类型(容器):<vector>

                       vector类型自身不是数据类型,只是一种类模板,可以定义任意多种数据类型。

            构造函数:

                                                 vector<T> v1;             // 默认构造函数,v1 为空

                                                 vector<T> v2(v1);        // v2 是 v1 的一个副本

                                                 vector<T> v3(n,i);          // v3 包含 n 个值为 i 的元素

                                                 vector<T> v4(n);          // v4 含有值初始化的元素的 n 个副本

            几种重要操作:

                               v.empty()          //  true or false

                               v.size()        // 返回 v 中元素个数

                                                          返回类型:

                                                                 vector<int>::size_type  // ok

                                                                vector::size_type         // error

                               v.push_back(t)     // v 末尾增加一个值为 t 的元素            

string word;vector<string> text;while(cin>>word){text.push_back(word);}

                               v[n]           //返回 v 中位置 n 的元素

                               v1 = v2

                               v1 == v2         // equal, reurn true

                               !=, <, <=, >, >=         //保持惯有含义


         try coding:

例题:3.13. 读一组整数到vector 对象,计算并输出每对相邻元素的和。如果读入元素个数为奇数,则提示用户最后一个元素没有求和,并输出其值。然后修改程序:头
尾元素两两配对(第一个和最后一个,第二个和倒数第二个,以此类推),计算每对元素的和,并输出。

#include<iostream>#include<string>#include<vector>;using namespace std;void sum1(vector<int> &a,int n);void sum2(vector<int> &a,int n);int main(){  int n;cout<<"Enter the number of values:"<<endl;cin>>n;vector<int> val;int tem;for(int i=0;i<n;++i){cin>>tem;val.push_back(tem);}sum1(val,n);cout<<endl;sum2(val,n);return 0;}void sum1(vector<int> &a,int n){for(int k=0;k<n;++k)cout<<a[k]<<" ";cout<<endl;for(int i=0;i<n-1;i+=2){cout<<(a[i]+a[i+1])<<"\t";}if(n%2==1)cout<<a[n-1];}void sum2(vector<int> &a,int n){for(int i=0;i<n;++i)cout<<a[i]<<" ";cout<<endl;  for(int i=0;i<n/2;i++)cout<<a[i]+a[n-1-i]<<"  ";if(n%2)cout<<"a["<<n/2<<"]"<<"="<<a[n/2];cout<<endl;}

例题:3.14. 读入一段文本到vector 对象,每个单词存储为vector 中的一个元素。把vector对象中每个单词转化为大写字母。输出vector 对象中转化后的元素,每8 个单词为一行输出。

#include<cctype>#include<iostream>#include<string>#include<vector>;using namespace std;int main(){  string word;vector<string> text;while(cin>>word)text.push_back(word);int tag=0;for(vector<string>::size_type ix=0;ix!=text.size();++ix){for(string::size_type ix2=0;ix2!=text[ix].size();++ix2){text[ix][ix2]=toupper(text[ix][ix2]);}if(tag<8){cout<<text[ix]<<" ";++tag;}else{cout<<endl;cout<<text[ix]<<" ";tag=tag%8;}}cout<<endl;return 0;}


bitset类型:<bitset>

     从低阶位开始存储。

     初始化:

                bitset<n> b;

                bitset<n> b(u);  // u 为 unsigned long 型,使用二进制低阶位;若不足,高阶位为 0.

                                 bitset<16> bitvec1(0xffff);  // 0-15 are set to 0   //unsigned long 32bit机器上,使用低阶位

                                 bitset<32> bitvec2(0xffff);  // 0-15,--->1;16-31,--->0; 

                                 bitset<128> bitvec3(oxffff); // 31-127,--->0        // 高阶位置 0

                bitset<n> b(s);  // b 是 string 对象 s 中含有位串的副本; s 直接表示为位模式,从右到左读入

                                 bitset<32> bitvec4("1100");  //  2-3,----->1;

                bitset<n> b(s,pos,n); // b 是 s 中从位置 pos 开始的 n 个位的副本

                                string str("1111010111111110011001101");

                                bitset<32> bitvec5(str,5,4);  // 1011. str[5] start. 0-4,--->1101.  inverse.

                              * bitset<32> bitvec6(str,str.size()-4)  // use last 4 characters 0-4,--->1011. inverse.

     其对象上的操作:

                  b.any()            // 有 1,true

                  b.none()          // 无 1,true

                  b.count()         // 1 的个数;返回 size_t 类型(定义在 cstddef 文件中),机器相关的 unsigned 类型 (return 32bit)

                  b.size()           // 二进制位数;size_t

                  b[pos]

                  b.test(pos)       // 若为1,true

                  b.set()             // 全部置 1

                  b.set(pos)

                  b.reset()          // 全部置 0

                  b.reset(pos)

                  b.flip()            // 逐位取反

                  b.to_ulong()   // 用 b 中同样二进制位返回一个 unsigned long 值,溢出时将引起异常

                  os << b        // 把 b 中位集输出到 os 流

下接第九章:http://blog.csdn.net/liyangguang1988/article/details/8973277

**********************************************************************************************************************************************************

iterator:

            const vector<int> vec(10,9);

            const vector<T>::iterator iter;

            vector<T>::const_iterator iter;

            vector<T>::iterator iter;

       赋值:

        vector<int> nums(10);for(vector<int>::iterator iter=nums.begin();iter!=nums.end();++iter)*iter=9;
容器改变长度后,引用iterator 的值失效。例如,vector 调用 push_back后,*iterator 的值将不可信赖。



预处理器的简单介绍:

        预处理器:是编译器在编译之前调用的一个独立程序。用来删除注释,加载头文件,执行宏替换。

                       加载头文件:#include指示只接受一个参数:头文件名。预处理器用指定的头文件的内容替代每个#include。

                                          由此,引出头文件多重包含问题:前2章中定义Sales_item类的头文件包含string库。Sales_item类含有一string类型的数据成员,因此可访问string                                           头文件。使用Sales_item头文件的程序也可能使用string库。在这种情况下,string头文件被包含了两次:一次通过程序本身直接包含,另一次通过                                           包含Sales_item头文件而间接包含。  为使头文件安全,使用预处理器定义头文件保护符(预处理器同时允许自定义变量)。

                                                           #ifndef SALESITEM_H

                                                           #define  SALESITEM_H

                                                           //definition of Sales_item class and related functions goes here
                                                           #endif     //end of  ifndef
                                               利用自定义的变量 SALESITEM_H  (作为标识) 来保证头文件只被处理一次。
                                             参考:( http://blog.163.com/Hoowang@126/blog/static/16537105820105263171744/  )

标准库名字和头文件:

          参考:( http://blog.sina.com.cn/s/blog_525221f90100dadf.html )



原创粉丝点击