您的位置:首页 > 编程语言 > C语言/C++

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这块,在下面再看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: