C++变量类型
基本类型
int
double
...
复合类型
引用
指针
const
标准库类型
string
vector
迭代器
内置数组
一维数组
多维数组
using声明
用到相应的库函数要首先声明,如要使用cin,就要从std命名空间中获取它。
using namespace::name
using std::cin;
using std::string;
using std::vector;
标准库类型string
1,使用string类型前
必须包含下面代码:
#include <string>
using std::string;
2,定义和初始化string对象
string s1("abd");
string s1="abd";
string s1=(3,'c');//s1为"ccc"。
3,string对象上的操作
getline(is,s)//从istream对象is中读取一行(用到换行符结束)赋给s,返回is。
s.empty()
s.size()//返回s中字符的个数,返回类型为string::size_type
s[n]//n从0开始
s1+s2//连接起来
s1==s2//完全相等,区分大小写
<,>,<=,>=//按字典顺序比较,区分大小写
4,处理string对象中的字符
isalnum(c)//当c是字母或数字时为真。
isalpha(c)//字母
isdigit(c)//数字
ispunct(c)//标点
isspace(c)//空格,回车,制表符,换行符
isupper(c)//大写字母
islower(c)//小写字母
tolower(c)//大写————>小写
toupper(c)//小写---->大写
常见用法:
1,计算string对象中的标点个数,把s中的每个字符分别
复制给c。
2,改变字符串中的字符
标准库类型vector
1,使用vector
需包含:
#include <vector>
using std::vector
vector是模板而不是类型,有vector可以生成其他类型,但需要给一些提示哈。如<>尖括号里面的:
vector<int> vec1={4,2,79,333};
//vec1包含4个int元素
vector<string> vec2={"adf","af",did""};
//列表初始化,vec2包含三个字符串元素
vector<vector<string>> vec3;
//vec3保存vector<string>类型的对象
向vector对象中添加元素
vector<int> v1;
for (int i = 0; i != 100; i++)
{
v1.push_back(i);//依次把整数值放到v1末端
}
vector<string> v2;
string s1;
while (cin >> s1)//输入的s1都被放在v2
v2.push_back(s1);
vector操作
v.empty()
v.size()//返回元素类型是vector<基本类型>::size_type
v.push_back(t)
v[n]//返回v中第n个位置上元素的引用,n从0开始,也为相应的size_type类型
v1==v2//元素完全相等
v1=v2//赋值
迭代器
我们已知知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另一种更通用的方法就是迭代器。
就迭代器而言,其对象是容器中的元素,使用迭代器可以访问某个元素。迭代器有有效和无效之分,有效的迭代器指向某个元素或者尾元素的下一个位置。
迭代器成员拥有begin和end成员。
auto b=v.begin(),e=v.end();//b,e
分别指向第一个元素和尾后元素
1,迭代器运算符
*iter//返回迭代器iter所指元素的引用
iter->mem//解引用并获取该元素的名为mem的成员,等价(*iter).mem
++iter//下一个元素
--iter
iter1==iter2//指示同一个元素
iter1!=iter2//会经常用到,要养成习惯
2,迭代器类型
迭代器类型如下:
vector<int>::iterator it;
string::iterator it;
vector<int>::const_iterator it;
string::const_iterator it;
迭代器类型:总与容器类型相关,一般情况下,无须知道其精确类型,养成用!=的习惯。
for(auto it=s.begin();it!=s.end()&&!isspace(*it);++it)
*it=toupper(*it)
//依次处理s中的每个字符,小写转为大写
auto c=it1-it2//返回迭代器it1和it2的距离,c的类型difference_type
使用迭代器实现二分搜索算法
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
//二分搜索算法
int sought = 21;//要寻找的数
vector<int> v;
for (int i = 0; i < 100; i++)
{
v.push_back(i);//v={0,1,2...99}
}
auto b = v.begin(), e = v.end();
auto mid = b + (e - b) / 2;
while (mid != e&& *mid != sought)
{
if (sought < *mid)
e = mid;
else
b = mid + 1;
mid = b + (e - b) / 2;
cout << *mid << endl;
}
return 0;
}
运行结果依次输出25,12,19,22,21
数组
数组和C风格字符串都是C语言的产物,C++尽量不要使用吧。
数组是一种类似于标准库vector类型的数据结构。但数组大小固定。
int *ptr[10];//ptr是含有十个整型指针的数组
int (*ptr)[10];//ptr是一个指针,指向含有十个整数的数组
默认情况下,类型修饰符从右向左一次绑定,有括号从内向外。
数组下标的类型size_t,指针相减的结果的类型为ptediff_t,都在cstddef头文件中定义了这些类型。
例子:输出数组的程序
#include <iostream>
using namespace std;
//数组形参
//在不知道数组元素个数的情况下,打印数组中的每个元素
//方法一:使用数组的begin和end 函数
//结果为输出1,3,4,5
void print1(const int *beg, const int *end)
{
while (beg != end)
cout << *beg++ << endl;
}
int main()
{
int a[4] = { 1,3,4,5 };
int *b = begin(a);
int *e = end(a);
print1(b, e);
return 0;
}
C风格字符串
C语言一般把字符串放在字符数组中,并以空字符串结束。
string s1="hello!";//s1包含6个字符
consr char s2[]="hello!";//s2包含7个字符
一般情况下还是使用标准库string类型比较好。
但是接口还是需要的,怎么把string对象转为const char*呢?
char *str=s1;//错误,不能把string对象赋值给const char*
char *str=s1.c_str();//正确,
c_str()的返回值是一个C风格的字符串。