cpp primer plus笔记012-STL模板库

  1. string类的构造函数:
    #include
    #include
    int main()
    {
    	std::string str1 = std::string("123");
    	std::string str2 = std::string(5, '4');
    	std::string str3 = std::string(str2);
    	std::string str4 = std::string();
    	std::string str5 = std::string("234234", 2);
    	std::string str6 = std::string("23", 3);
    	std::string str7 = std::string(str1.begin() + 1, str1.end());
    	std::string str8 = std::string(str2, 2);
    	std::string str9 = std::string(str2, 2, 2);
    	//std::string(std::string&& str)noexcept
    	//std::string(initializer_list il)
    	char ch[5] = "1234";
    	std::string str10 = std::string(ch);
    	std::cout << str1 << std::endl;
    	std::cout << str2 << std::endl;
    	std::cout << str3 << std::endl;
    	std::cout << str4 << std::endl;
    	std::cout << str5 << std::endl;
    	std::cout << str6 << std::endl;
    	std::cout << str7 << std::endl;
    	std::cout << str8 << std::endl;
    	std::cout << str9 << std::endl;
    	std::cout << str10 << std::endl;
    }
    
    123
    44444
    44444
    
    23
    23
    23
    444
    44
    1234
    
  2. string的find函数方法:
    #include
    #include
    int main()
    {
    	std::string str = "2342342342356";
    	std::string temp = "2342";
    	std::cout << str.find("56", 2) << std::endl;
    	std::cout << str.find("56") << std::endl;
    	std::cout << str.find("89") << std::endl;
    	std::cout << str.find(temp, 2) << std::endl;
    	std::cout << str.find(temp) << std::endl;
    	std::cout << str.find(temp + '0') << std::endl;
    	std::cout << str.find("345", 3, 2) << std::endl;
    	std::cout <<"npos = " << std::string::npos << std::endl;
    	std::cout << str.find("345", 3) << std::endl;
    	std::cout << str.find("2", 2) << std::endl;
    	unsigned long long ans = std::string::npos;
    	int cnt = 0;
    	while (ans)
    	{
    		ans /= 2;
    		++cnt;
    	}
    	std::cout << cnt << std::endl;
    }
    
    11
    11
    18446744073709551615
    3
    0
    18446744073709551615
    4
    npos = 18446744073709551615
    18446744073709551615
    3
    64
    
  3. 智能指针与常规指针的区别是一旦程序运行离开了代码块,智能指针将自动的释放指向的内存,因此new的时候不需要delete语句,注:智能化指针初始化不能直接被赋值数据的地址,只能被赋值为在堆内存的地址,因为智能指针在释放内存时会调用delete运算符。
    #include
    #include
    #include
    class Report
    {
    private:
    	std::string str;
    public:
    	Report(const std::string s) :str(s)
    	{
    		std::cout << "Object created!\n";
    	}
    	~Report()
    	{
    		std::cout << "Object deleted!\n";
    	}
    	void comment() const
    	{
    		std::cout << str << std::endl;
    	}
    };
    int main()
    {
    	std::string str;
    	{
    		std::auto_ptr<Report> ps(new Report("using auto_ptr"));
    		ps->comment();
    	}
    	{
    		std::shared_ptr<Report> ps(new Report("using shared_ptr"));
    		ps->comment();
    	}
    	{
    		std::unique_ptr<Report> ps(new Report("using unique_ptr"));
    		ps->comment();
    	}
    	{
    		//std::shared_ptr ps(&str);
    	}
    	return 0;
    }
    
    Object created!
    using auto_ptr
    Object deleted!
    Object created!
    using shared_ptr
    Object deleted!
    Object created!
    using unique_ptr
    Object deleted!
    
  4. 三种智能指针的区别:
    • auto_ptr:如果前面的智能指针的指向和现有的智能指针指向了同一个对象,则针对这个对象的操作所有权传递给了现有的指针,而原有的智能指针无法引用该对象,auto_ptr使用需要使用new分配内存,注,unique_ptr和shared_ptr指针不能转换成auto_ptr,但是auto_ptr指针能转换成unique_ptr和shared_ptr指针。
    • unique_ptr: 如果前面的智能指针和现有的智能指针指向了同一个对象,则编译器会报错,unique_ptr使用需要使用new或者new[]分配内存。
    • shared_ptr如果前面的智能指针和现有的智能指针指向了同一个对象,则二者共享针对这个对象操作的所有权,shared_ptr使用需要new分配内存,注shared_ptr指针不能与unique_ptr共享同一个对象所有权。
    #include
    #include
    #include
    int main()
    {
    	std::unique_ptr<std::string> film1[5] =
    	{
    		std::unique_ptr<std::string>(new std::string("u111")),
    		std::unique_ptr<std::string>(new std::string("u222")),
    		std::unique_ptr<std::string>(new std::string("u333")),
    		std::unique_ptr<std::string>(new std::string("u444")),
    		std::unique_ptr<std::string>(new std::string("u555"))
    		//上面的auto_ptr已经转换为unique_ptr指针
    	};
    	std::auto_ptr<std::string> film2[5] =
    	{
    		std::auto_ptr<std::string>(new std::string("a111")),
    		std::auto_ptr<std::string>(new std::string("a222")),
    		std::auto_ptr<std::string>(new std::string("a333")),
    		std::auto_ptr<std::string>(new std::string("a444")),
    		std::auto_ptr<std::string>(new std::string("a555"))
    	};
    	std::shared_ptr<std::string> film3[5] =
    	{
    		std::shared_ptr<std::string>(new std::string("u111")),
    		std::shared_ptr<std::string>(new std::string("u222")),
    		std::shared_ptr<std::string>(new std::string("u333")),
    		std::shared_ptr<std::string>(new std::string("u444")),
    		std::shared_ptr<std::string>(new std::string("u555"))
    		//上面的shared_ptr已经转换为unique_ptr指针
    	};
    	//std::unique_ptr ptr1 = film2[2]; //编译器报错
    
    	//std::auto_ptr ptr1 = film2[1]; //与下面语句使用运行时会终止程序
    	//std::cout << *film2[1] << std::endl;        
    
    
    	std::shared_ptr<std::string> ptr = film3[2];
    	(*ptr) += "123";
    	std::cout << (*ptr) << " " << (*film3[2]) << std::endl;
    
    
    	std::unique_ptr<double[]> unptr1(new double(5));
    	std::unique_ptr<std::string[]> unprt2(new std::string[4]);
    	return 0;
    } 
    
    u333123 u333123
    

你可能感兴趣的:(c++,c++,笔记)