C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace。
使用using声明避免每一次显示声明命名空间 用法
using namespace::name;
例如
#include
using std::cin;
int main()
{
int i;
cin >> i;
std::cout << i;
return 0;
}
按照规定 推荐每个名字都需要有单独的using声明
且头文件中不应包含using声明 避免始料未及的名字冲突
可变长的字符序列
使用string类型必须包含头文件
string类型包含在命名空间std中
定义和初始化string有以下几种方式
string s1; // 默认初始化 s1是一个空字符串
string s2 = s1; // s2是s1的副本 拷贝初始化
string s3 = "hiya"; // s3是该字符串字面值的副本 拷贝初始化
string s4(2, 'c'); // s4的值是"cc" 直接初始化
使用等号=初始化一个变量 实际上执行的是拷贝初始化 编译器吧等号右侧的初始值拷贝到新创建的对象中去
如果不适用等号 则是直接初始化
copy initialization
direct initialization
读取输出string对象使用cin cout
cin读入遇到空格或换行停止
读取一整行的string对象使用getline()
string s1, s2;
cin >> s1;
getline(cin, s2);
getline()读取一行忽略了最后的换行符
size()函数返回的是一个unsigned类型的整数(注意不要随便喝int混用 以及判断越界情况)
比较 相加 赋值都是比较简单的 自己敲代码尝试可以
把string当做字符数组处理可以
empty()方法根据string对象是否为空返回一个布尔值
string str;
if (str.empty())
{
cout << "str is empty";
}
string str;
string::size_type len = str.size();
size()函数返回string对象的长度
size()函数返回的是一个string::size_type类型的变量
string::size_type是一种无符号整形
注意 不要将无符号整形和int混用 会产生意想不到的后果
对于string对象而言 允许直接把一个对象赋值给另一个对象
string str1(10, 'c');
string str2 = str1; // 这样直接赋值string对象是合理的
string对象的相加可以直接使用加法运算符 + 把两个string对象拼接到一起
也可以使用假发运算符把string对象和字面值相加
字面值就是类似于"asdashdhaskjhdkjas"这种双引号中的字面字符串
注意 不能直接把两个字面值相加 必须确保语句中加法运算符两侧的运算对象至少有一个是string
划重点 我一直倾向于C++的程序就用C++的写法 虽然C++是兼容C 并且为了兼容C做了很多的工作
但是在某些特性上 我还是倾向于用C++的写法 比如以下
range for是C++11标准提供的一种新语句 语法形式为
for (declaration : expression)
statement
其中 expression是一个对象 标示序列 declaration部分负责定义一个变量 用于访问序列中的基础元素
auto:C++11中,auto不再是一个存储类型指示符,而是一个自动推导变量的类型
decltype:选择并返回操作数的数据类型。在此过程中,编译器只是分析表达式并得到它的类型,却不进行实际的计算表达式的值。
关于auto和decltype的具体定义和使用参考本文上面的描述 这里不做具体阐述
string str("some thing");
for (auto c : str)
{
cout << c << endl;
}
上述代码中使用auto关键字决定c的类型 这里是char 每次迭代 将str的下一个字符拷贝到c 通过cout流输出
在看下面的例子
string str("Hello, World!!");
decltype(str.size()) cnt = 0;
for (auto c : str)
{
if (ispunct(c)) // 判断c是不是标点符号 ispunct的定义参考上文
{
++ cnt;
}
}
cout << cnt << endl;
如果想要改变string对象的值 就必须把循环变量定义为引用类型
string str = "dasjbdekjasdhashdkj"
for (auto & c : str) // 注意这里定义的是&c 而不是c 我们这里定义c的引用才能通过改变c改变str的值
{
c = toupper(c);
}
cout << str << endl;
下标运算符接收的输入参数是string::size_type类型的值
string对象的下标从0开始计算 最后一个字符是s[s.size() - 1]
下标的值被称为下标或者索引 任何表达式的值只要是一个整数就可以作为索引
如果索引是有符号整数(例如int值)将自动转换为string::size_type类型的无符号整数
划重点 如果索引位置的string没有值就会产生数组越界的报错 程序会中断 所以访问一定要判断string的范围 确保在范围内访问
再次强调 不要越界 保证索引的合法 很多很多很多很多新手都会在这个地方跌倒无数次
相同对象的集合
因为容纳着其他对象 所以也被称之为容器
使用头文件
在命名空间std中
使用vector必须包含以下语句
#include
using std::vector;
C++11新标准提供了一种新的初始化vector对象的方法
注意 使用拷贝初始化时 只能提供一个初始值
如果提供的是一个类内初始值 则只能使用拷贝初始化或者使用花括号的形式初始化
例如 int类型的vector对象 默认的初始值都是0
圆括号提供的值用来构造
花括号提供的值表述成列表初始化
划重点 可以自己思考一下{}和()的区别
pushback()
vector<int> v;
for (int i = 0; i < 10; ++ i)
{
v.push_back(i);
}
访问vector中元素的方法和string差不多
需要注意的是 要是用size_type 需要制定它是由哪种类型定义的 vector对象的类型总是包含着元素的类型 例如
vector<int>::size_type // 正确的
vector::size_type // 错误的
划重点 确保下标合法的一种有效手段就是尽可能使用范围for语句 强烈推荐