C++学习笔记,粗糙原代码

柔情痞子 提交于 2020-02-01 10:15:21

C++学习笔记,粗糙原代码

第一次写博客,后面慢慢完善吧,现在先记录一下学习的代码。
目前在按照Essential C++这本书学习,觉得讲的还是不错的,适合小白。我目前学到了第三章第六小节,希望寒假能把这本书学完吧(我看后面东西挺多的)
这是第三章前五节

#include<iostream>
#include<vector>
#include<string>
#include<list>
#include<iterator>
#include<deque>
#include<algorithm>
#include<functional>
using namespace std;
template<typename IteratorType, typename elemType>
IteratorType find(IteratorType &first, IteratorType &last,
 const elemType& value);//find函数的声明
 int main()
{
 //这一段只是简单的测试泛型指针iterator
 //vector<string>svec;
 //vector<string>::iterator iter = svec.begin();
 //string sa[4] = { "one","two","three","four" };
 //const vector<string>cs_vec(sa,sa+4);
 //string sa[4] = { "one","two","three","four" };
 //const vector<string>cs_vec(sa,sa+4);

//测试find函数
 const int asize = 8;
 int ia[asize] = { 1,1,2,3,5,8,13,21 };
 vector<int>ivec(ia, ia + asize);
 list<int>ilist(ia, ia + asize);
 int* pia = find(ia, ia + asize, ia[3]);
 //array
 if (pia != ia + asize)
  {
    cout << find(ia, ia + asize, ia[3]);
  }
 //vector
 vector<int>::iterator it;
 it = find(ivec.begin(), ivec.end(), ia[3]);
 if (it != ivec.end())
  {
    cout << "find it";
    cout << *it;
  //cout << find(ivec.begin(), ivec.end(), ia[3];)
  //为什么有函数的时候会报错呢?
  //不能直接cout<<find, 需要用泛型指针来代替
  }

//list
 list<int>::iterator iter;
 iter = find(ilist.begin(), ilist.end(), ia[5]);
 if (iter != ilist.end())
  {
    cout << "find list";
  
  }


 list<string>slist(16, "unassigned");//产生特定大小容器,并指定初值
 cout << slist.front();
 cout << slist.max_size() << endl;
 list<string>slist2(slist);


//使用deque添加删除元素
 //push_back()在最末端安插一个元素
 //pop_back()删除最后一个元素
 //list和deque提供push_front()和pop_front(),在最前端安插和删除元素
 deque<int>a_line;
 int ival;
 while (cin >> ival)
  {
    a_line.push_back(ival);
    int curr_value = a_line.front();
    cout << curr_value;
    a_line.pop_front();
 }
 return 0}
 //定义了find函数,返回地址
template<typename IteratorType,typename elemType>
IteratorType find(IteratorType &first,IteratorType &last,
 const elemType &value)
 {
     for (; first != last; ++first)
     {
           if (value == *first)
           { 
           return first;
           }
     }
   return last;
}

下面是第六小节的代码,有用到function object,我觉得多熟悉记忆就好。

//用函数指针的filter声明
//vector<int>filter(const vector<int>& vec, 
//               int filter_value, 
//               bool (*pred)(int, int));
vector<int>filter(const vector<int>& vec,
 int val, less<int>& lt);//用function object的声明

 template<typename InputIter, typename OutputIter,//模板函数
          typename ElemType, typename Comp>
OutputIter filter2(InputIter first, InputIter last,
                   OutputIter at, const ElemType& val,
                   Comp pred);//经过模板函数修改,消除了和元素型别关联的过滤函数
bool less_than(int v1, int v2);//比较函数,用函数指针,下同
bool greater_than(int v1, int v2);
int count_occurs(const vector<int>& vec, int val);//显示某个数出现次数的函数
int main()
{
 int ia[10] = { 1,2,3,10,7 ,13,8,9,16,22, };
 vector<int>ivec(ia, ia + 10);
 int value = 3;
 less<int>lt;//为什么这里定义成指针需要初始值呢?
 vector<int>lt_10 = filter(ivec, value, lt);
 for (int i = 0; i < lt_10.size(); i++)
 {
   cout << lt_10[i];
   cout << '\n';
 }
 //cout << '\n';
 //测试出现某个数字次数的函数
 //cout << count_occurs(big_vec, 10);

//测试sort 排序函数
 sort(ivec.begin(),ivec.end());
  for (int i = 0; i < ivec.size(); i++)
 {
  cout << ivec[i]<<' '}
 cout << '\n';
 sort(ivec.begin(), ivec.end(), greater<int>{});
 for (int i = 0; i < ivec.size(); i++)
 {
  cout << ivec[i]<<' ';
 }


//利用transform,对Fib数列进行相加,相乘等
 int ic[5] = { 1,1,2,3,5 };
 int ib[5] = { 1,1,1,1,2 };
 vector<int>fib(ic, ic + 5);
 vector<int>pell(ib, ib + 5);
 vector<int>fib_plus_pell(5);
 transform(fib.begin(), fib.end(), pell.begin()
  , fib_plus_pell.begin(), multiplies<int>());
  
  for (int i = 0; i < fib_plus_pell.size(); i++)
 {
  cout << fib_plus_pell[i] << '\t';
 }
//测试模板函数 filter2
 const int elem_size = 8;
 int ix[elem_size] = { 12,8,46,0,6,21,3,7 };
 vector<int>ivec(ix, ix + elem_size);

 //下面这个容器用来存储过滤结果
 int ix2[elem_size];
 vector<int>ivec2(elem_size);
cout << "filtering integer array for values less than 8\n";
 filter2(ix, ix + elem_size, ix2, elem_size, less<int>());

cout << "filtering interger vector for values greater than8\n";
 filter2(ivec.begin(), ivec.end(), ivec2.begin(), elem_size, greater<int>());
}

//使用函数指针引入小于函数
//vector<int>filter(const vector<int>& vec,
// int filter_value,bool (*pred)(int, int))

//使用 binder adapter 绑定配接器 Function object adapter
//会提高效率
vector<int>filter(const vector<int>& vec,
                  int val,less<int>&lt)
{
 vector<int> nvec;
 vector<int>::const_iterator iter = vec.begin();
 //bind2nd(less<int>,val);
 //会把val绑定于less<int>的第二个参数身上。
 //于是,less<int>会将每个元素拿来和val比较
 while ((iter = find_if(iter, vec.end(),
         bind2nd(lt, val))) != vec.end())
{
  //每当iter!=vec.end(),
  //iter 便是指向某个小于val的元素
  nvec.push_back(*iter);
  iter++;
}
return nvec;
}
//将函数filter()改为function template
//消除filter和vector元素型别的关联
template<typename InputIter,typename OutputIter,
         typename ElemType,typename Comp>
 OutputIter filter2(InputIter first, InputIter last,
              OutputIter at, const ElemType& val,
              Comp pred)
{
   while ((first =
  find_if(first, last, bind2nd(pred, val))) != last)
 {
  cout << "found value:" << *first << endl;
  //执行assign操作,然后令俩个iterators 前进
  *at++ = *first++;
  }
  return at;
}
//小于函数
bool less_than(int v1, int v2)
{
 return v1 < v2 ? true : false;
}
//大于函数
bool greater_than(int v1, int v2)
{
 return v1 > v2 ? true : false;
}
//返回某个数字出现次数的函数
int count_occurs(const vector<int>& vec, int val)
{
 vector<int>::const_iterator iter = vec.begin();
 int occurs_count = 0;
 while ((iter = find(iter, vec.end(), val)) != vec.end())
 {
  ++occurs_count;
  ++iter;
 }
 return occurs_count;
}

以后继续努力。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!