C++ STL算法篇(三)与智能指针 day19
生成异变算法
- for_each:遍历
- fill:填充
- fill_n:n个元素为指定元素填充
- generate:填充
- generate_n:填充n个元素
- transform:一元操作
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
int main()
{
std::vector<int> vec{ 1,2,3,4,5,6 };
for_each(vec.begin(), vec.end(), [](int& data) {std::cout << data << " "; });
std::cout << std::endl;
for_each(vec.begin(), vec.end(), [](int& data) {std::cout << data * 2 << " "; });
std::cout << std::endl;
std::vector<int>vec2(5);
fill(vec2.begin(), vec2.end(), 21);
for_each(vec2.begin(), vec2.end(), [](int& data) {std::cout << data << " "; });
std::cout << std::endl;
fill_n(vec2.begin(), 3, 6);
for_each(vec2.begin(), vec2.end(), [](int& data) {std::cout << data << " "; });
std::cout << std::endl;
generate(vec2.begin(), vec2.end(), []() {return 77; });
for_each(vec2.begin(), vec2.end(), [](int& data) {std::cout << data << " "; });
std::cout << std::endl;
generate_n(vec2.begin(), 3, []() {return 8; });
for_each(vec2.begin(), vec2.end(), [](int& data) {std::cout << data << " "; });
std::cout << std::endl;
std::vector<int> one{ 1,2,3,4,5 };
std::vector<int> two(one.size());
transform(one.begin(), one.end(), two.begin(), [](int data) {return -data; });
copy(two.begin(), two.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
- 运行结果
堆算法
- 堆就是一段连续的内存,按照二叉树的方式研究,存在特定结构的存储方式
- 大顶堆:父大于子
- 小顶堆:子大于父
- make_heap:创建堆
- push_heap:入堆
- pop_heap:出堆 (单纯把元素放到容器后面,手动调用相应的尾部删除函数)
- sort_heap:堆排序
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
int main()
{
std::vector<int> data = { 2,5,6,3 };
make_heap(data.begin(), data.end());
for (auto v : data)
{
std::cout << v << " ";
}
std::cout << std::endl;
while (!data.empty())
{
pop_heap(data.begin(), data.end());
std::cout << data.back() << " ";
data.pop_back();
make_heap(data.begin(), data.end());
}
std::cout << std::endl;
std::vector<int> vec{ 2,5,6,3 };
make_heap(vec.begin(), vec.end(), std::less<int>());
sort_heap(vec.begin(), vec.end(), std::less<int>());
for (auto v : vec)
{
std::cout << v << " ";
}
std::cout << std::endl;
return 0;
}
- 运行结果
C++智能指针
- 智能指针智能在内存释放,管理new出来的对象是不需要手动释放
shared_ptr:共享型指针
- swap 交换两个智能指针管理的数据
- reset 重新设置
- make_shared 创建智能指针,这个函数参数由构造函数决定
#include <iostream>
#include <algorithm>
#include <vector>
#include <memory>
class student
{
public:
student(std::string name = "", int age = 0) :name(name), age(age) {}
std::string getName()const { return name; };
int getAge()const { return age; };
~student()
{
std::cout << "对象释放了" << std::endl;
}
protected:
std::string name;
int age;
};
void FileFree(FILE*& fp)
{
std::cout << "文件释放成功" << std::endl;
fclose(fp);
}
void shared()
{
std::shared_ptr<int> object(new int(123));
if (!object)
{
std::cout << "初始化失败!" << std::endl;
}
else
{
std::cout << *object << std::endl;
int* pInt = object.get();
std::cout << *pInt << std::endl;
std::cout << "size:" << object.use_count() << std::endl;
std::shared_ptr<int> obeject2(object);
std::cout << "size:" << object.use_count() << std::endl;
std::shared_ptr<student> xiaoguaPtr = std::make_shared<student>("小瓜", 21);
std::cout << xiaoguaPtr->getName() << " " << xiaoguaPtr->getAge() << std::endl;
xiaoguaPtr.reset(new student("大瓜", 22));
std::cout << xiaoguaPtr->getName() << " " << xiaoguaPtr->getAge() << std::endl;
}
{
std::cout << "---------------------------------------" << std::endl;
std::shared_ptr<FILE> pf(fopen("1.txt", "w+"), [](FILE*& fp) {
std::cout << "文件释放成功" << std::endl;
fclose(fp); });
fputs("小瓜", pf.get());
}
{
std::shared_ptr<student> pArr(new student[4], [](student*& p) {delete[]p; });
}
{
std::cout << "---------------------------------------" << std::endl;
std::vector<student*> vec;
vec.push_back(new student);
vec.push_back(new student);
for (auto v : vec)
{
delete v;
}
}
std::cout << "---------------------------------------" << std::endl;
std::vector<std::shared_ptr<student>> vec2;
vec2.push_back(std::shared_ptr<student>(new student("小瓜", 21)));
vec2.push_back(std::shared_ptr<student>(new student("大瓜", 22)));
for (auto v : vec2)
{
std::cout << v->getName() << " " << v->getAge() << std::endl;
}
}
int main()
{
shared();
return 0;
}
- 运行结果
weak_ptr:弱引用型指针
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <memory>
class B;
class A
{
public:
A() { std::cout << "A" << std::endl; }
~A() { std::cout << "~A" << std::endl; }
std::weak_ptr<B> b;
};
class B
{
public:
B() { std::cout << "B" << std::endl; }
~B() { std::cout << "~B" << std::endl; }
std::weak_ptr<A> a;
};
void weak()
{
std::shared_ptr<A> Aobject = std::make_shared<A>();
std::shared_ptr<B> Bobject = std::make_shared<B>();
std::cout << Aobject.use_count() << std::endl;
std::cout << Bobject.use_count() << std::endl;
Aobject->b = Bobject;
Bobject->a = Aobject;
std::cout << Aobject.use_count() << std::endl;
std::cout << Bobject.use_count() << std::endl;
}
void test_weak_ptr()
{
std::shared_ptr<int> pint(new int(21));
std::cout << pint.use_count() << std::endl;
std::weak_ptr<int> wint(pint);
std::cout << wint.use_count() << std::endl;
std::cout << *wint.lock() << std::endl;
}
int main()
{
weak();
std::cout << "------------------------------------" << std::endl;
test_weak_ptr();
return 0;
}
- 运行结果
unique_ptr:独享型指针
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <memory>
class student
{
public:
student()
{
std::cout << "student" << std::endl;
}
~student()
{
std::cout << "~student" << std::endl;
}
};
int main()
{
std::unique_ptr<int> ptr(new int(21));
std::cout << *ptr << std::endl;
std::unique_ptr<int> ptr2;
ptr2 = move(ptr);
std::cout << *ptr2 << std::endl;
std::unique_ptr<int> ptr3;
ptr3.reset(ptr2.release());
std::cout << *ptr3 << std::endl;
{
using FUNC = void(*)(student*&);
std::unique_ptr<student, FUNC> pStudent(new student[4],
[](student*& p) {delete[] p; });
auto Lambad = [](student*& p) {delete[]p; };
std::unique_ptr<student,decltype(Lambad)> pstu(new student[4],Lambad);
}
return 0;
}
- 运行结果