cpp msic
cpp misc
std::set iterate方法
// Set of strings std::set<std::string> setOfStr = { "jjj", "khj", "bca", "aaa", "ddd" };
// Creating a iterator pointing to start of set std::set<std::string>::iterator it = setOfStr.begin(); // Iterate till the end of set while (it != setOfStr.end()) { // Print the element std::cout << (*it) << " , "; //Increment the iterator it++; }
from: https://thispointer.com/different-ways-to-iterate-over-a-set-in-c/
std::vector iterate方法
vector<int>obj; for(int i=0;i<10;i++) { obj.push_back(i); cout<<obj[i]<<","; } cout << endl << "vector size is :" << obj.size() << endl; //数组循环遍历 for(int i=0;i<obj.size();i++) { cout<<obj[i]<<","; }
更多iterate方法见如下link:
https://www.jb51.net/article/218197.htm
std::unique_ptr
std::unique_ptr
是具有以下特性的智能指针:
- 通过指针保留了唯一的对象的所有权,并且
unique_ptr
离开作用域时,会析构指向的对象。
如果一个由unique_ptr指向的对象里也有unique_ptr指针,则也会将它指向的对象deconstruct,如下面例子实际执行结果:
// Example program #include <iostream> #include <string> #include <memory> #include <vector> #include <utility> class TestClass0 { public: uint8_t a; ~TestClass0() { std::cout << "deconstruct TestClass0.\n"; } }; class TestClass1 { public: TestClass1() : ptr(nullptr) {} TestClass1(TestClass1 && tc) : ptr(std::move(tc.ptr)) {} std::unique_ptr<TestClass0> ptr; ~TestClass1() { std::cout << "deconstruct TestClass1.\n"; } }; class TestClass2 { public: std::vector<TestClass1> v; ~TestClass2() { std::cout << "deconstruct TestClass2.\n"; } }; int main() { std::unique_ptr<TestClass2> mptr(new TestClass2()); TestClass1 tc = TestClass1(); tc.ptr.reset(new TestClass0()); mptr->v.push_back(std::move(tc)); std::cout << "unique ptr test.\n"; }
执行结果
unique ptr test. deconstruct TestClass1. //local var tc in main() deconstruct TestClass2. deconstruct TestClass1. //TestClass1 object in vector TestClass2.v deconstruct TestClass0.
std::unique_ptr<type>与普通指针
如果是unique_ptr,则在生存期结束时会将它指向的对象free;而如果是普通指针(比如通过new来创建的),则需要用delete显式free指针指向的对象,如下面示例代码,如果没有delete指针,则这个对象将没有被free(内存泄露?)
// Example program #include <iostream> class TestClass { public: TestClass() { std::cout << "TestClass construct.\n"; } ~TestClass() { std::cout << "TestClass deconstruct.\n"; } }; int main() { TestClass *tc = new TestClass(); std::cout << "object free test.\n"; delete tc; return 0; }
执行结果:
TestClass construct. object free test. TestClass deconstruct.
左值引用&右值引用
左值引用:
int num = 10; int &a = num;
右值引用:
int num = 10; int &&a = 10; //用右值进行引用的初始化
a = 100; //改变右值引用的值
这两种引用都必须在声明引用时进行引用的初始化
创建对象的方式
分为两类,动态分配和编译器自动分配
// Example program #include <iostream> class TestClass { public: TestClass() { std::cout << "TestClass construct.\n"; } TestClass(int a) { std::cout << "TestClass(int) construct.\n"; num = a; } ~TestClass() { std::cout << "TestClass deconstruct.\n"; } private: int num; }; int main() { TestClass tc0; //empty arg constructor, stack TestClass tc1(10); //int arg constructor, stack TestClass tc2 = TestClass(); //empty arg constructor, call constructor explicitly, stack TestClass *tc3 = new TestClass(); //empty arg constructor, dynamicly alloc on heap
//TestClass *tc4 = new TestClass(11); //dynamicly alloc on heap std::cout << "object creation.\n"; delete tc3; //free on heap return 0; }
执行结果:
TestClass construct. TestClass(int) construct. TestClass construct. TestClass construct. object creation. TestClass deconstruct. TestClass deconstruct. TestClass deconstruct. TestClass deconstruct.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2021-04-27 android WatchDog(sw watchdog)工作原理