string 支持长度可变的字符串
vector 用于保存一组指定类型的对象
bitset 提供操作位更直接的方法
3.1 命名空间的 using 声明
使用范例
using namespace::name;
//
#include <iostream>
#include <string>
using std::cin;
using std::string;
int main() {
string s;
cin >> s;
cout << s; // error,没有使用using声明
std::cout << s; // ok
return;
}
//
1. 每个名字都需要一个using声明
一个using只能作用于一个命名空间成员
重写1.2.2节中的代码
#include <iostream>
#include <string>
using std::cout;
using std::cin;
using std::endl;
int main() {
cout << "Enter two numbers:" << endl;
int v1, v2;
cout << The sum of << v1
<< " and " << v2
<< " is " << v1 + v2 << endl;
return 0;
}
///
2. 使用标准库类型的类定义
在头文件中,必须总是使用完全限定的标准库名字。否则,造成代码冗余。
注意:通常头文件中应该只定义确实必要的东西。请养成这个好习惯。
//习题3.1
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
int main() {
int base, exponent;
long result = 1;
cout << "Enter base and exponent:" << endl;
cin >> base >> exponent;
if (exponent < 0) {
cout << "Exponent can not be smaller than 0" << endl;
return -1;
}
if (exponent > 0) {
for (int cnt = 1; cnt <= exponent; cnt++) {
result *= base;
}
}
cout << base
<< " raised to the power of "
<< exponent < ": "
<< result << endl;
return 0;
}
3.2 标准库 string 类型
满足对字符串的一般应用
必须包含头文件
#include <iostream>
using std::string;
3.2.1 string 对象的定义和初始化
构造函数
string s1;
string s2(s1);
string s3("value");
string s4(n, 'c');
警告:标准库string类型和字符串常量值不是同一种类型
3.2.2 string 对象的读写
int main() {
string s;
cin >> s;
cout << s << endl;
return 0;
}
string类型的输入操作符 >>
~读取并忽略开头所有的空白字符
~读取字符直至再次遇见空白字符
3.2.2.1 读入未知数目的 string 对象
int main() {
string word;
while (cin >> word) {
cout << word << endl;
}
return 0;
}
3.2.2.2 用getline读取整行文本
int main() {
string line;
while (readline(cin, line)) {
cout << line << endl;
}
return 0;
}
2.2.3 string对象的操作
s.emyty()
s.size()
s[n]
s1 + s2
s1 = s2
v1 == v2
!= , <, <=, > 和 >=
size和empty操作
int main() {
string st("The expense of spirit\n");
cout << "The size of " << st << "is " << st.size()
<< "characters, including the newline" << endl;
return 0;
}
string::size_type
关系操作符
任何一个大写字母都小于任意的小写字母
string big = "big". small = "small";
string s1 = big;
if (big == small) {
}
if (big <= s1) {
}
采用字典排序
string substr = "Hello";
string phrase = "Hello World";
string slang = "Hiya";
substr小于phrase,而slang大于substr和phrase
赋值
string st1, st2 = "The expense of spirit";
st1 = st2;
先释放,再分配,最后复制
两个string 对象相加
concatenation
string s1("hello, ");
string s2("world\n");
string s3 = s1 + s2;
s1 += s2;
字符串字面值的连接
string s1("hello");
string s2("world");
string s3 = s1 + ", " + s2 + "\n";
注意:当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型。
从string对象获取字符
[] 下标操作符
需要取一个size_type类型的值,来标明要访问字符的位置。
s[s.size() - 1] 代表s的最后一个字符
string str("some string");
for (string::size_type ix = 0; ix != str.size(); ix++) {
// cout << str[ix] << endl;
str[ix] = '*';
}
string 对象中字符的处理
cctype头文件
isalnum
isalpha
iscntrl
isdigit
isgraph
islower
ispreint
ispunct
isspace
isupper
isxdigit
tolower
toupper
测试成功 返回非0值
测试失败 返回0
习题3.7
#include <iostream>
#include <string>
using namespace std;
using std::string;
int main() {
string s1, s2;
cout << "Enter two strings:" << endl;
cin >> s1 >> s2;
if (s1 == s2) {
cout << "They are equal." << endl;
} else if (s1 > s2) {
cout << "\"" << s1 << "\" is bigger than"
<< " \"" << s2 << \"" << endl;
} else {
cout << "\"" << s2 << "\" is bigger than"
<< " \"" << s1 << \"" << endl;
}
return 0;
}
3.3 标准库vector
同一类型对象的集合
称为 “容器”
#include <vector>
using std::vector;
说明vector保存何种对象的类型
vector<int> ivec;
vector<Sales_item> Sales_vec;
vector不是数据类型,而只是一个类模版
3.3.1 vector的定义和初始化
vector<T> v1;
vector<T> v2(v1);
vector<T> v3(n, i);
vector<T> v4(n);
1. 创建确定个数的元素
vector<int> ivec1;
vector<int> ivec2(ivec1);
vector<string> svec(ivec1);// 错误,不是同一个类型
vector<int> ivec4(10, -1);
vector<string> svec(10, "hi!");
2. 值初始化
vector<int> fvec(10); // 10个元素,全部初始化成0
vector<string> svec(10); // 10个元素,全部初始化成空字符串
3.3.2 vector对象的操作
v.empty()
v.size()
v.push_back(t)
v[n]
v1 = v2
v1 == v2
!=, <, <=, >, >=
1 vector对象的size
vector<int> :: size_type // ok
vector :: size_type // error
2. 添加元素
string word;
vector<string> text;
while (cin >> word) {
text.push_back(word);
}
3. vector下标操作
for (vector<int>::size_type ix = 0; ix != ivec.size; ix++) {
ivec[ix] = 0;
}
4. 下标操作不添加元素
vector<int> ivec;
for (vector<int>::size_type ix = 0; ix != 10; ++ix) {
ivec.push_back(ix);
}
习题3.16
vector<int> ivect(10, 42);
vector<int> ivect(10);
for (vector<int>::size_type ix = 0; ix != 10; ++ix) {
ivect[ix] = 42;
}
vector<int> ivect;
for (vector<int>::size_type ix = 0; ix != 10; ++ix) {
ivect.push_back(42);
}
习题3.14
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
int main() {
vector<string> svec;
string str;
count << "Enter text(Ctrl+Z to end):" << endl;
while (cin >> str) {
svec.push_back(str);
}
if (svec.size() == 0) {
return -1;
}
cout << "Transformed elements from the vector:" << endl;
for (vector<string>::size_type ix = 0; ix != svec.size(); ++ix) {
for (string::size_type index = 0; index != svec[ix].size(); ++index) {
if (islower(svec[ix][index])) {
svec[ix][index] = toupper(svec[ix][index]);
}
}
cout << svec[ix] << " ";
if ((ix + 1) % 8 == 0) {
cout << endl;
}
}
return 0;
}
3.4 迭代器
对容器来说 推荐使用迭代器
1. 容器的迭代器
vector<int>::iterator iter;
2. begin和end操作
vector<int>::iterator iter = vect.begin();
begin和end都返回iterator对象
begin指向 第1个
end指向 最后一个元素的下一个
3. 自增和解引用运算
*iter = 0; 指向第一个元素
++iter指向第二个元素
4. 其他操作
== 和 !=
判断迭代器是否指向同一个元素
5. 程序实例
for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix) {
ivec[ix] = 0;
}
for (vector<int>::iterator iter = ivec.begin(); iter != iter.end(); ++iter) {
*iter = 0;
}
6. const_iterator
只读
*解引用操作符 返回 const 引用 不许修改
for (vector<int>::const_iterator iter = text.begin(); iter != text.end(); ++iter) {
cout << *iter << endl;
*iter = " ";// error
}
const_iterator 和 const iterator的区别
习题 3.17
#inlude <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> ivec(10, 20);
for (ivec<int>::iterator iter = ivec.begin(); iter != iter.end(); ++iter) {
*iter = (*iter) * 2;
}
return 0;
}
迭代器的算术操作
iter + n
iter - n
n的类型应该是vector的size_type或difference_type
iter1 - iter2
计算两个迭代器之间的距离 difference_type signed类型
注意:
任何改变vector长度的操作都会使已存在的迭代器失效。
3.5 标准库bitset类型
bitset类简化了位集的处理
声明
#include <bitset>
using std::bitset;
与vector不同,bitset类型对象的区别仅在其长度而不在其类型。
bitset<32> bitvec;// 32 bits, all zero
初始化方法
bitset<n> b;
bitset<n> b(u);
bitset<n> b(s);
bitset<n> b(s, pos, n);
用unsigned值初始化bitset对象