数组与字符串
动态数组
std::vector 类
头文件 < vector >
- 初始化:
vector<int> a(10); // 初始化了10个默认值为0的元素
- 基本操作:
1. push_back()在末尾插入元素
2. insert()在指定位置插入元素
3. 可以使用数组索引或者指针的方式访问元素
4. pop_back()删除最后一个元素
5. 使用capacity和size查询vector的容量和大小,在插入元素的时候如果需要扩大容量会进行内部缓冲区的重新分配,重新分配的逻辑是智能的,为了避免插入下一个元素时重新分配提前分配了比当前需求更大的容量
6. clear()删除容器的所有元素
7. empty()判断是否为空
另:deque类,头文件< deque>,与vector类似,不同的时可以使用push_front()和pop_front()操作在开头增加或者减少元素
字符串
可以使用C风格的字符串处理函数,但是经常因为终止空字符有坑
使用std::string 动态存储字符串
头文件 < string >
- 初始化
//常量字符串初始化
const char* constCStyleString = "Hello String!";
std::string strFromConst (constCStyleString);
//或
std::string str2 ("Hello String!");
//用前几个字符初始化
std::string str3(constCStyleString, 5);
//用特定字符初始化
std::string str4(10,'a');
//直接赋值
std::string strFromConst = constCStyleString;
- 访问string的字符内容
- [ ]
- 迭代器
- 另:c_str() 可以获得string对象
- 拼接
- +=
- append(),多个重载版本,可以接受另一个string或者C风格的字符串
- 查找字符或子串 find()
示例:
//返回值为位置(第一次出现)
size_t charPos = sampleStr.find ("day", 0);
//返回值与string::npos(实际值是-1)比较
- 截短函数erase()
三个重载版本
//在给定偏移位置和字符数时删除指定数目的字符。
string sampleStr ("Hello String! Wake up to a beautiful day!");
sampleStr.erase (13, 28);
//iterator points to a specific character
string::iterator iCharS = find (sampleStr.begin (),sampleStr.end (), 'S');
sampleStr.erase (iCharS);
//在给定由两个迭代器指定的范围时删除该范围内的字符。
sampleStr.erase (sampleStr.begin (), sampleStr.end ());
- 字符串反转 std::reverse()
头文件 < algorithm >
string sampleStr ("Hello String! We will reverse you!");
reverse (sampleStr.begin (), sampleStr.end ());
-大小写转换std:: transform
transform(inStr.begin(), inStr.end(), inStr.begin(), ::tolower);
transform(inStr.begin(), inStr.end(), inStr.begin(), ::toupper);
有一点迷惑,看一下原型
template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperation op);
//result为存放结果的起始地址
如果编写的字符串中含有非拉丁字符,如中文,需要使用std::wstring
C++14 引入 “ ”s(双引号中间是字符串),能够操作带有空字符’\0’的字符缓冲区