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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值