【C++笔记】第三章 标准库类型.cc

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对象







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值