C++容器功能非常强大,除了包装了基础的数据结构之外,还封装了有关该数据结构相关的增删查改算法。

1 STL String

  • 构造
  • 遍历
  • string和char *转换
  • 拼接
  • 查找和替换
  • 插入和删除
  • 算法相关

1.1 构造

string有4种构造方式:
  • 1 通过const char*赋值
  • 2 构造函数初始化
  • 3 拷贝构造函数赋值
  • 4 使用N个字符进行初始化
int main() {
	string s1 = "aaaa";
	string s2("bbbb");
	string s3 = s2;
	string s4(10, 'a');
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;

	return 0;
}

1.2 遍历

遍历有3种方式:
  • 1 数组方式,使用[]
  • 2 at()
  • 3 stl迭代器遍历
int main() {
	string s1 = "aaaa";
	for (int i = 0; i < s1.size(); i++) {
		cout << s1[i] << endl;
	}

	for (int i = 0; i < s1.size(); i++) {
		cout << s1.at(i) << endl;
	}

	for (auto iter = s1.begin(); iter != s1.end(); iter++) {
		cout << *iter << endl;
	}

	return 0;
}

1.3 string和char *的转换

  • string需要通过c_str()方法才能转成const char *
  • const char*可以直接赋值成为string

1.4 string的拼接

  • string类型+
  • append方法

1.5 string的查找和替换

  • find函数用来查找字符串中从位置x开始指定的字符的位置。
  • replace函数用来替换字符串中指定位置的字符,原理:先删除该字符,然后重新插入。
  • find(str, index)
  • replace(offindex, len, str)
int main() {
	string s1 = "hello world";
	size_t offindex = s1.find("lo", 0);
	cout << offindex << endl;
	s1.replace(offindex, 2, "xx");
	cout << s1 << endl;
	return 0;
}

1.6 string的插入和删除

  • insert(index, string)
  • erase(iter_begin, iter_end)
int main() {
	string s1 = "hello world";
	s1.erase(s1.begin(), s1.begin() + 3);
	cout << s1 << endl;
	s1.insert(0, "hel");
	cout << s1 << endl;
	return 0;
}

2 Vector

2.1 初始化

vecor同样有4种初始化方式:

  • 1 直接初始化 vector v1 = {1, 2, 3};
  • 2 拷贝构造函数 vector v2 = v1;
  • 3 部分元素初始化 vector v3(v2.begin(), v2.end());
  • 4 N个元素M初始化  vector v4(N, M);

2.2 遍历

[] 和 at

2.3 删除

erase(iter, iter+n);

2.4 插入

insert(位置,元素) 位置都需要使用迭代器的位置

insert(位置,数量,元素)

int main() {
	vector vec = {1, 2, 3};
	vec.insert(vec.begin()+3, 4);
	for (auto v : vec) {
		cout << v << endl;
	}
	return 0;
}

3 deque

deque是一个双端容器数组,可以在头部和尾部操作元素,deque是stack和queue的底层容器。
  • push_back()
  • push_front()
  • pop_back()
  • pop_front()
  • distance(v1.begin(), it) 求取迭代器it距离begin的距离
int main(int argc, const char * argv[]) {
    
    //定义deque对象
    deque d1;
    
    //尾部插入元素
    d1.push_back(10);
    d1.push_back(20);
    d1.push_back(30);
    
    //头部插入元素
    d1.push_front(1);
    d1.push_front(2);
    d1.push_front(3);
    
    //尾部删除元素
    d1.pop_back();
    
    //头部删除元素
    d1.pop_front();
    
    //修改头部和尾部的值
    d1.front() = 111;
    d1.back()  = 222;
    
    //查找元素为1的下标
    //通过distance求取下标
    deque::iterator it = d1.begin();
    while (it != d1.end()) {
        if (*it == 1) {
            cout << "下标:" << distance(d1.begin(), it) << endl;
        }
        it++;
    }
    
    //遍历
    for (deque::iterator it = d1.begin(); it != d1.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
    
    return 0;
}

4 list

双端链表,可以在头尾插入和删除元素,但是由于其为链表的特性,无法随机访问。 list的删除提供了remove和erase:
  • erase照常需要提供迭代器的开始和结尾
  • remove可以删除指定的值
int main(int argc, const char * argv[]) {
    
    //创建list对象
    list l;
    
    //添加数据
    for (int i = 0; i < 10; i++) {
        l.push_back(i);
    }
    l.push_back(100);
    l.push_back(100);
    
    //删除头部元素
    l.erase(l.begin());
    
    //删除某个区间
    list::iterator it = l.begin();
    it++;
    it++;
    it++;
    l.erase(l.begin(), it);
    
    //移除值为100的所有元素
    l.remove(100);
    
    //遍历
    for (list::iterator it = l.begin(); it != l.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;
    
    return 0;
}

5 set和map

set的key和value相同,主要是用来去重。

map的key的value可以不一致,用来当做字典使用。

set详细结构:

map的详细结构:

set的插入和删除:

  • s1.insert(元素)
  • s1.erase(iter)

map的插入和删除:

  • m1.insert(make_pair(2, 2));
  • m1.erase(iter);

6 匿名函数用于排序

6.1 vector排序

int main() {
	vector vec = {4, 5, 3, 2, 1, 43, 321};
	// 1 升序
	sort(vec.begin(), vec.end());
	for (auto v : vec) {
		cout << v << "\t";
	}
	cout << endl;
	// 2 倒序
	sort(vec.rbegin(), vec.rend());
	for (auto v : vec) {
		cout << v << "\t";
	}
	cout << endl;
	//3 翻转 - 升序
	reverse(vec.begin(), vec.end());
	for (auto v : vec) {
		cout << v << "\t";
	}
	cout << endl; // 4 匿名函数排序 - 倒序 sort(vec.begin(), vec.end(), [](int a, int b){return a>b;});
	for (auto v : vec) {
		cout << v << "\t";
	}
	cout << endl;
	return 0;
}

6.2 map排序

由于sort函数对map类容器不生效,需要将map先转化为vec,使用sort对vec容器进行排序。  
int main() {
	unordered_map map;
	map[1] = 10;
	map[2] = 13;
	map[3] = 5;
	vector> vec(map.begin(), map.end());
	sort(vec.begin(), vec.end(), [](pair& a, pair& b) {
		return a.second > b.second;
	});
	for (auto m : vec) {
		cout << m.second << "\t";
	}
	cout << endl;
	return 0;
}