主要介绍两种最重要的标准库类型:string和vector。
string表示可变长的字符序列。
vector存放的是某种给定类型对象的可变长序列。
1 标准库类型string
#include <string>
using std::string;
1.1 定义和初始化string类型
string s1;
string s1(s2);
string s2 = s1; //拷贝初始化
string s3 = "hiya"; //直接初始化
string s4(10,'c');
string s8 = string(10,'c');
1.2 string对象上的操作
os<<s; is>>s; getline(is,s); s.empty(); s.size();
s[n]; s1+s2; s1=s2; s1==s2; s1!=s2; <, <=, >, >=;
string s1, s2;
cin >> s1 >> s2;
cout << s1 << s2 << endl;
string word; while(cin >> word) cout << word << endl;
int main() {string line; while(getline(cin, line)) cout << line << endl; return 0;}
string的empty()和size操作
if(!line.empty()) 表示如果字符串line是空的
line.size()返回值的数据类型是string::size_type类型,所以需要在使用前面加auto
auto len = line.size();
字面值和string对象相加
string s4 = s1 + ", ";//正确:把一个string对象和一个字面值相加
string s5 = "hello" + ", ";//错误:两个运算对象都不是string
string s6 = s1 + ", " + "world";//正确:每个加法运算符都有一个运算对象是string
string s7 = "hello" + ", " + s2;//错误:不能把字面值直接相加
处理每个字符?使用基于范围的for语句
string str("some string");
for(auto c: str) cout << c << endl;
for(auto &c: s) c = toupper(c);
2 标准库类型vector
#include <vector>
using std::vector;
vector<int> ivec;
vector<vector<int> >
2.1 定义和初始化vector对象
vector<T> v1 vector<T> v2(v1)
vector<T> v2 = v1 vector<T> v3(n,val)
vector<T> v4(n) vector<T> v5{a,b,c,...}
vector<T> v5 = {a,b,c,...}
2.2 其他vector操作
v2.push_back(i); v.empty(); v.size(); v[n];
vector<int> v{1,2,3,4,5,6,7,8,9};
for(auto &i: v) i *= i;
for(auto i: v) cout << i << " "; cout << endl;
使用下标运算符能获取到指定的元素。和string一样,vector对象的下标也是从0开始计起,下标的类型是相应的size_type类型。
3 迭代器介绍
类似于指针类型,迭代器也提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符。使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另一个元素。迭代器有有效和无效之分,这一点和指针差不多。有效的迭代器或者指向某个元素,或者指向容器中尾元素的下一个位置。
3.1 使用迭代器
auto b = v.begin(), e = v.end();// b表示v的第一个元素,e表示v为元素的下一个位置
//标准容器迭代器的运算符
*iter //返回迭代器iter所指元素的引用
iter->mem //解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem
++iter //令itera指示容器中的下一个元素
--iter //令iter指示容器中的上一个元素
iter1 == iter2 //判断两个迭代器是否相等(不相等)
string s("some string");
if(s.begin() != s.end()){auto it = s.begin(); *it = toupper(*it);}
for(auto it = s.begin(); it != s.end()&&!isspace(*it); ++it) *it = toupper(*it);
迭代器类型
vector<int>::iterator it; // it 能读写vector<int>的元素
vector<int>::const_iterator it; // it 只能读vector<int>的元素
string::iterator it;
string::const_iterator it;
auto it3 = v.cbegin();
只要两个迭代器指向的是同一个容器中的元素或者尾元素的下一个位置,就能将其相减,所得结果是两个迭代器的距离。所谓距离指的是右侧的迭代器向前移动多少位置就能追上左侧的迭代器,其类型名为difference_type的带符号整数。
4 数组
在使用数组下标的时候,通常将其定义为size_t类型。在cstddef头文件中定义了size_t类型。