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
利用自定义的变量 SALESITEM_H (作为标识) 来保证头文件只被处理一次。
参考:( http://blog.163.com/Hoowang@126/blog/static/16537105820105263171744/ )
标准库名字和头文件:
参考:( http://blog.sina.com.cn/s/blog_525221f90100dadf.html )