1、map
键值对形式的数据结构
- insert方式插入
key不不能重复,并且默认按照key从小到大排序
map<int, string> map;
map.insert(make_pair(40, "32"));
map.insert(make_pair(10, "10"));
map.insert(make_pair(10, "11"));
map.insert(make_pair(10, "12"));
map.insert(make_pair(30, "30"));
map.insert(make_pair(20, "30"));
map.insert(make_pair(20, "31"));
map.insert(make_pair(30, "22"));
map.insert(make_pair(30, "32"));
for (auto it = map.begin(); it != map.end(); it++) {
cout<<it->first<<" "<<it->second<<endl;
}
10 10
20 30
30 30
40 32
- [ ]方式赋值
相同key会覆盖、默认也是从小到大排序
map<int, string> map;
map[10] = "10";
map[10] = "15";
map[20] = "20";
map[15] = "15";
for (auto it = map.begin(); it != map.end(); it++) {
cout<<it->first<<" "<<it->second<<endl;
}
10 15
15 15
20 20
- find函数获取指定key对应的元素
map<int, string> map;
map[10] = "10";
map[10] = "15";
map[20] = "20";
map[15] = "15";
auto it = map.find(20);
cout << it->first << " " << it->second << endl;
20 20
- multimap
key可以重复,并且按照key进行分组排序
map.insert(make_pair(40, "32"));
map.insert(make_pair(10, "10"));
map.insert(make_pair(10, "11"));
map.insert(make_pair(10, "12"));
map.insert(make_pair(30, "30"));
map.insert(make_pair(20, "30"));
map.insert(make_pair(20, "31"));
map.insert(make_pair(30, "22"));
for (auto it = map.begin(); it != map.end(); it++) {
cout<<it->first<<" "<<it->second<<endl;
}
10 10
10 11
10 12
20 30
20 31
30 30
30 22
40 32
2、谓词(仿函数)
class ComPareObject{
public:
void operator()(){
cout<<"仿函数"<<endl;
}
};
void fun(){
cout<<"普通函数"<<endl;
}
int main() {
ComPareObject f;
f.operator()();
fun();
}
仿函数
普通函数
3、自定义谓词(仿函数)
- 自定义谓词实现foreach遍历
class ComPare {
public:
void operator()(int item) {
cout << "遍历结果:" << item << endl;
}
};
int main() {
set<int> sets;
sets.insert(20);
sets.insert(50);
sets.insert(10);
sets.insert(88);
sets.insert(9);
auto begintIt = sets.begin();
auto endIt = sets.end();
for_each(begintIt, endIt,ComPare());
}
遍历结果:9
遍历结果:10
遍历结果:20
遍历结果:50
遍历结果:88
- 使用普通函数遍历
void forEach(int item){
cout << "遍历结果:" << item << endl;
}
int main() {
set<int> sets;
sets.insert(20);
sets.insert(50);
sets.insert(10);
sets.insert(88);
sets.insert(9);
auto begintIt = sets.begin();
auto endIt = sets.end();
for_each(begintIt, endIt,forEach);
}
遍历结果:9
遍历结果:10
遍历结果:20
遍历结果:50
遍历结果:88
- for_each源码分析
template<typename _InputIterator, typename _Function>
_GLIBCXX20_CONSTEXPR
_Function
for_each(_InputIterator __first, _InputIterator __last, _Function __f)
{
// concept requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
__glibcxx_requires_valid_range(__first, __last);
for (; __first != __last; ++__first)
__f(*__first);
return __f; // N.B. [alg.foreach] says std::move(f) but it's redundant.
}
需要三个参数,第一二个参数分别是迭代器首尾,而第三个参数则需要一个Function,可以理解成需要传入一个函数。接着下面其实几是通过迭代器++然后调用传过来的function。有点类似Kotlin中的高阶函数。
4、自定义多元谓词
仿函数中有一个参数称一元谓词,多个参数称为多元谓词
- 通过自定义多元谓词实现比较器排序
class ComPare {
public:
//二元谓词
bool operator()(int _x, int _y) {
return _x > _y;
}
};
int main() {
set<int, ComPare> sets;
sets.insert(20);
sets.insert(50);
sets.insert(10);
sets.insert(88);
sets.insert(9);
for (auto it = sets.begin(); it != sets.end(); it++) {
cout << *it << endl;
}
}
88
50
20
10
9
5、对象在容器中的生命周期变化
class Student {
public:
int age;
string name;
Student(int age, string name) {
this->age = age;
this->name = name;
}
Student(const Student &student) {
cout << "拷贝构造函数" << endl;
this->age = student.age;
this->name = student.name;
}
~Student() {
cout << "析构函数" << endl;
}
};
int main() {
Student student(18, "小红");
vector<Student> v;
//执行一次拷贝构造函数,把对象拷贝到容器
v.insert(v.begin(), student);
student.age = 20;
cout << "student的值:" << student.age << student.name << endl;
//执行一次拷贝构造函数,把容器对象拷贝出来
Student student2 = v.front();
cout << "student2的值:" << student2.age << student2.name << endl;
//弹栈的时候,会弹出 student student2 以及容器总的student,所以调用三次析构函数
}
拷贝构造函数
student的值:20小红
拷贝构造函数
student2的值:18小红
析构函数
析构函数
析构函数
6、 C++ 预定义函数
C++的一些内置函数
plus<int> add_func;
plus<string> add_func2;
int value = add_func(1,3);
string value2 = add_func2("1","2");
cout << value<<"-----"<<value2<< endl;
4-----12
网友评论