c++Primer5,总览与IO库和泛型算法
2016-03-28 10:22
411 查看
先前曾看过c++primer第四版,大致看的,工作需要,也用了这么久,但是总感觉没什么长进,后来又陆续要是用c++11,于是现在看看c++Primer第五版。
先看目录,第一章还是开始,第一部分为c++基础,依次是:变量和基本类型,字符串,向量,数组,表达式,语句,函数,类。
第二部分为c++标准库,内容为:IO库,顺序容器,泛型算法,关联容器,动态内存。
目前看完这两部分,和primer4对照下,这里记录IO库和泛型算法的部分,另外动态内存引入了新的智能指针,自己没怎么用过,略去。
关于函数的部分,lambda当作函数用,但却是一个对象,依稀记得函数对象这个东西。
还有函数绑定,现在也是经常用到,这个比函数指针要好用多了。参考c++函数那个里面的函数指针绑定。
IO库
IO类型定义在三个独立的头文件中:iostream定义读写控制窗口的类型;fstream定义读写已命名文件的类型;sstream定义读写存储在内存中的string对象的类型
iostream
istream 从流中读取
ostream 写到流中去
iostream 从istream和ostream派生而来,对流进行读写
fstream
ifstream 从文件中读取,由istream派生而来
ofstream 写到文件中取,由ostream派生而来
fstream 由iostream派生而来,用于读写文件
sstream
istringstream 从string对象中读取,由istream派生而来
ostringstream 写到string对象中去,由ostream派生而来
stringstream 由iostream派生而来,用于读写string对象
百度了一些例子,验证了一下
关于iostream的部分,基本只使用下两条:
int num = 0;
std::cin>>num;
std::cout<<num<<std::endl;
关于文件的操作,把上面得到的num存档,再读档:
ofstream out("C:\\1.txt", std::ios::ate | std::ios::app);
if (!out)
{
std::cout<<"open file field"<<std::endl;
}
out<<"hi:"<<num<<endl;
out.close();
ifstream in;
in.open("C:\\1.txt");
string tempStr;
in>>tempStr;
std::cout<<tempStr<<std::endl;
char ss[100];
in.get();
in.getline(ss, 100);
std::cout<<ss<<std::endl;
in.close();
关于内存IO的操作
istringstream istr;
istr.str("1 56.7");
cout << istr.str()<<endl;
int a;
float b;
istr>>a;
cout<<a<<endl;
istr>>b;
cout<<b<<endl;
ostringstream ostr;
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<<gstr<<endl;
stringstream sstr;
//--------int转string-----------
int aa=100;
string str;
sstr<<aa;
sstr>>str;
cout<<str<<endl;
//--------string转char[]--------
sstr.clear();
string name = "colinguan";
char cname[200];
sstr<<name;
sstr>>cname;
cout<<cname<<endl;
泛型算法:
只读算法
find(vec.cbegin(), vec.cend(), i_val)
accumulate(vec.cbegin(), vec.cend(), 0)
equal(vec1.cbegin(), vec1.cend(), vec2.cbegin())
写容器算法
fill(vec.begin(), vec.end(), 0)
fill_n(vec.begin(), vec.size(), 0)
fill_n(back_inserter(vec), 10, 0)
copy(begin(arr1), end(arr1), arr2)
replace(ilist.begin(), ilist.end(), 0, 88)
replace_copy(ilist.cbegin(), ilist.cend(), back_inserter(ivec), 0, 88)
排序且去除重复项
1step,sort(words.begin(), words.end())
2step,auto end_unique = unique(words.begin(), words.end())//仅作用于相邻重复项
3step,words.erase(end_unique, words.end())
定制操作
int sz = 10;
auto wc = find_if(words.begin(), words.end(), bind(check_size, placeholders::_1, sz)); bool check_size(const string &a, int sz) { return a.size() >= sz; }
auot wc = find_if(words.begin(), words.end(), [sz](const string &a){ return a.size() >= sz; })
for_each(wc, words.end(), [](const string &s){ cout<<s<<" "; })//lambda就是定义一种类类型(类函数),注意值捕获和引用捕获的区别
transform(vi.egin(), vi.end(), vi.begin(), [](int i) -> int {if(i <0) return -i; else return i;})
只记录了这些,感觉lambda于函数绑定这块还是很有必要细细看。
另外关于OOP这块,在下面再看。
先看目录,第一章还是开始,第一部分为c++基础,依次是:变量和基本类型,字符串,向量,数组,表达式,语句,函数,类。
第二部分为c++标准库,内容为:IO库,顺序容器,泛型算法,关联容器,动态内存。
目前看完这两部分,和primer4对照下,这里记录IO库和泛型算法的部分,另外动态内存引入了新的智能指针,自己没怎么用过,略去。
关于函数的部分,lambda当作函数用,但却是一个对象,依稀记得函数对象这个东西。
还有函数绑定,现在也是经常用到,这个比函数指针要好用多了。参考c++函数那个里面的函数指针绑定。
IO库
IO类型定义在三个独立的头文件中:iostream定义读写控制窗口的类型;fstream定义读写已命名文件的类型;sstream定义读写存储在内存中的string对象的类型
iostream
istream 从流中读取
ostream 写到流中去
iostream 从istream和ostream派生而来,对流进行读写
fstream
ifstream 从文件中读取,由istream派生而来
ofstream 写到文件中取,由ostream派生而来
fstream 由iostream派生而来,用于读写文件
sstream
istringstream 从string对象中读取,由istream派生而来
ostringstream 写到string对象中去,由ostream派生而来
stringstream 由iostream派生而来,用于读写string对象
百度了一些例子,验证了一下
关于iostream的部分,基本只使用下两条:
int num = 0;
std::cin>>num;
std::cout<<num<<std::endl;
关于文件的操作,把上面得到的num存档,再读档:
ofstream out("C:\\1.txt", std::ios::ate | std::ios::app);
if (!out)
{
std::cout<<"open file field"<<std::endl;
}
out<<"hi:"<<num<<endl;
out.close();
ifstream in;
in.open("C:\\1.txt");
string tempStr;
in>>tempStr;
std::cout<<tempStr<<std::endl;
char ss[100];
in.get();
in.getline(ss, 100);
std::cout<<ss<<std::endl;
in.close();
关于内存IO的操作
istringstream istr;
istr.str("1 56.7");
cout << istr.str()<<endl;
int a;
float b;
istr>>a;
cout<<a<<endl;
istr>>b;
cout<<b<<endl;
ostringstream ostr;
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<<gstr<<endl;
stringstream sstr;
//--------int转string-----------
int aa=100;
string str;
sstr<<aa;
sstr>>str;
cout<<str<<endl;
//--------string转char[]--------
sstr.clear();
string name = "colinguan";
char cname[200];
sstr<<name;
sstr>>cname;
cout<<cname<<endl;
泛型算法:
只读算法
find(vec.cbegin(), vec.cend(), i_val)
accumulate(vec.cbegin(), vec.cend(), 0)
equal(vec1.cbegin(), vec1.cend(), vec2.cbegin())
写容器算法
fill(vec.begin(), vec.end(), 0)
fill_n(vec.begin(), vec.size(), 0)
fill_n(back_inserter(vec), 10, 0)
copy(begin(arr1), end(arr1), arr2)
replace(ilist.begin(), ilist.end(), 0, 88)
replace_copy(ilist.cbegin(), ilist.cend(), back_inserter(ivec), 0, 88)
排序且去除重复项
1step,sort(words.begin(), words.end())
2step,auto end_unique = unique(words.begin(), words.end())//仅作用于相邻重复项
3step,words.erase(end_unique, words.end())
定制操作
int sz = 10;
auto wc = find_if(words.begin(), words.end(), bind(check_size, placeholders::_1, sz)); bool check_size(const string &a, int sz) { return a.size() >= sz; }
auot wc = find_if(words.begin(), words.end(), [sz](const string &a){ return a.size() >= sz; })
for_each(wc, words.end(), [](const string &s){ cout<<s<<" "; })//lambda就是定义一种类类型(类函数),注意值捕获和引用捕获的区别
transform(vi.egin(), vi.end(), vi.begin(), [](int i) -> int {if(i <0) return -i; else return i;})
只记录了这些,感觉lambda于函数绑定这块还是很有必要细细看。
另外关于OOP这块,在下面再看。
相关文章推荐
- c++ 函数返回引用
- leetcode Add Digits 之C语言实现
- leetcode Add Digits 之C++实现
- 设计模式--命令模式C++实现
- leetcode之Nim Game C语言实现
- leetcode之Nim Game C++实现
- leetcode 之Maximum Depth of Binary Tree 用 C语言实现
- 认识Visual C++各个版本
- 结构体大小问题
- c++ 强制类型转换 static_cast dynamic_cast reinterpret_cast和const_
- [面试] C++ STL(一)—— 向一个vector中添加N个元素,平均的添加的性能是?
- C语言中将数字转换为字符串的方法
- 进程间的相互通讯 C++
- c++ 中__declspec 的用法
- oj 中G++和C++区别(转)
- Unix awk使用手册(下)
- c++ 深拷贝 函数后加const
- C语言位域精解
- 汇编写启动代码之设置栈和调用C语言2
- c语言:四舍五入