笔试算法常用函数和数据输入总结

来源:互联网 发布:qq企业邮箱域名 编辑:程序博客网 时间:2024/06/06 00:09
算法一般考:
1.字符串
 C++算法编程常用函数:
头文件是:#include <algorithm>
1:find函数:
vector<int>::iterator it=find(vec.begin(),vec.end(),a);
 Map<int,int>::iterator it=m.find(a);  a是map的key值
class map_value_finder
{
public:
  map_value_finder(const int &cmp_string):m_s_cmp_string(cmp_string){}
  bool operator ()(const std::map<int, int>::value_type &pair)
  {
return pair.second == m_s_cmp_string;
  }
private:
const int &m_s_cmp_string;                    
};
itable = std::find_if(table.begin(), table.end(), map_value_finder(fd));
通过上面的函数调用,可以按map的value查询,不过效率不高,因为map是二叉树来存的;其他自行百度
2:迭代器:
//遍历map容器,
For(it=map.begin();it!=map.end();it++){
Cout<<”key”<<it->first<<“value”<<it->second<<endl;
}
3:数组转置 (<algorithm> reverse)
   reverse(v.begin(),v.end());
4:排序(<algorithm> sort)
     sort(v.begin(),v.end())
5:删除 (erase clear)
     s.erase(it + 1,it + 4); clear()
    6:string和vector有很多相同的东西,比如length(),size(),empty(),reverse(),相对也容易,就不一一说了。
7:string与char *
  memcpy)(char * ,string.c_str(),string.size());
8:sscanf
    例子:
   #include<iostream>
#include<string>
#include<cstdio>


using namespace std;


int main()
{
string s1,s2,s3;
char sa[100],sb[100],sc[100];
sscanf("abc 123 wcd","%s%s%s",sa,sb,sc);
s1 = sa;
s2 = sb;
s3 = sc;
cout << s1 << " " << s2 << " " << s3 << endl;


//将字符串分离成数字,分隔符为',''$'
int a,b,c;
sscanf("4,5$6","%d,%d$%d",&a,&b,&c);
cout << a << " " << b << " " << c << endl;
return 0;
}
9:set介绍
set是用红黑树的平衡二叉索引树的数据结构来实现的,插入时,
它会自动调节二叉树排列,把元素放到适合的位置,确保每个子树
根节点的键值大于左子树所有的值、小于右子树所有的值,插入重
复数据时会忽略。set迭代器采用中序遍历,检索效率高于vector、
deque、list,并且会将元素按照升序的序列遍历。set容器中的数值,
一经更改,set会根据新值旋转二叉树,以保证平衡,构建set就是为了
快速检索(python中的set一旦建立就是一个常量,不能改的)。
例子:
#include<iostream>
#include<set>


using namespace std;


int main()
{
set<int> v;
v.insert(1);
v.insert(3);
v.insert(5);
v.insert(2);
v.insert(4);
v.insert(3);


//中序遍历 升序遍历
for(set<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}
cout << endl;


for(set<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit)
{
cout << *rit << " ";
}
cout << endl;


return 0;

}
10:number --> string
#include <iostream>
#include <map>
#include <string>


using namespace std;


int main()
{
map<int,char> m;


for(int i = 0; i < 10; ++i)
{
m[i] = '0' + i;
}


int n = 7;


string out = "the number is :";
cout << out + m[n] << endl;


return 0;
}
11:multimap
multimap由于允许有重复的元素,所以元素插入、删除、查找都与map不同。
  插入insert(pair<a,b>(value1,value2))
至于删除和查找,erase(key)会删除掉所有key的map,查找find(key)返回第一个key的迭代器
#include <iostream>
#include <map>
#include <string>


using namespace std;


int main()
{
multimap<string,double> m;


m.insert(pair<string,double>("Abc",123.2));
m.insert(pair<string,double>("Abc",123.2));
m.insert(pair<string,double>("xyz",-43.2));
m.insert(pair<string,double>("dew",43.2));


for(multimap<string,double>::iterator it = m.begin(); it != m.end(); ++it )
{
cout << (*it).first << ":" << (*it).second << endl;
}
cout << endl;


return 0;
}
12:deque
deque和vector一样,采用线性表,与vector唯一不同的是,deque采用的分块的线性存储结构
(1)    构造函数
deque(int nSize):创建一个deque,元素个数为nSize
(2)    增加函数


void push_front(const T& x):双端队列头部增加一个元素X


void push_back(const T& x):双端队列尾部增加一个元素x
(3)    删除函数


Iterator erase(iterator it):删除双端队列中的某一个元素


Iterator erase(iterator first,iterator last):删除双端队列中[first,last)中的元素


void pop_front():删除双端队列中最前一个元素


void pop_back():删除双端队列中最后一个元素


void clear():清空双端队列中最后一个元素
(4)    遍历函数


reference at(int pos):返回pos位置元素的引用


reference front():返回手元素的引用


reference back():返回尾元素的引用


iterator begin():返回向量头指针,指向第一个元素


iterator end():返回指向向量中最后一个元素下一个元素的指针(不包含在向量中)


reverse_iterator rbegin():反向迭代器,指向最后一个元素


reverse_iterator rend():反向迭代器,指向第一个元素的前一个元素
(5)    判断函数


bool empty() const:向量是否为空,若true,则向量中无元素


13:statck
empty() 堆栈为空则返回真


pop() 移除栈顶元素


push() 在栈顶增加元素


size() 返回栈中元素数目


top() 返回栈顶元素
14:vector
(1)头文件#include<vector>.


(2)创建vector对象,vector<int> vec;


(3)尾部插入数字:vec.push_back(a);


(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。


(5)使用迭代器访问元素.


vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;


(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素


  vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始


(8)向量大小:vec.size();


(9)清空:vec.clear();
15:queue用法
queue入队,如例:q.push(x); 将x 接到队列的末端。
queue出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问queue队首元素,如例:q.front(),即最早被压入队列的元素。
访问queue队尾元素,如例:q.back(),即最后被压入队列的元素。
判断queue队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()


16:sort函数自定义比较函数
        用法例子:
#include<iostream>
#include<vector>
#include<string>
#include <algorithm>
using namespace std;


bool cmp(pair<string,int> a,pair<string,int> b)
{
return a.second>b.second;
}


int main()
{
string file,input;
vector<pair<string,int>> error;
while(getline(cin,input))
{
  if(input.size()==0)
  continue;
unsigned int index=input.rfind('\\');
file=input.substr(index+1);
error.push_back(make_pair(file,1));
for(int i=0;i<error.size()-1;i++)
{
if(error[i].first==file)
{
error[i].second++;
error.pop_back();
break;
}
}
}
stable_sort(error.begin(),error.end(),cmp);
int dax=0;
while(dax<8&&dax<error.size())
{
string check=error[dax].first;
int t=check.find(' ');
if(t>16)
{
error[dax].first.erase(0,t-16);
}
cout << error[dax].first << ' ' << error[dax].second << endl;
dax++;
}
return 0;
}

17:做算法时,如何获得输入的数据
(1)以空格形式输入一组数据,比如:1 2 3 4;
用cin>>a>>b>>c>>d;将1234分别赋值给abcd
(2)以空格形式输入一串字符,比如:1 2 3 4 5 56 5 ...
vector<int> vec;
for(int i=0;i<n;i++){
int x; 
scanf("%d",&x);
vec.push_back(x);
}

(3)cin.get(),cin.getline,cin.get(a)区别
#include <iostream>  
int main()  
{/****************** 
  1.cin.getline()与他相比,比较粗一些 
  举例:先定义字符数组 char a[20]; 
  然后 cin.getline(a,20);即把数组的内容 
  读入进来。它通过换行符来确定行尾,但不保存 
  换行符 
  2.cin.get()则将换行符留在输入队列中 
  举例:假设我们两次调用cin.get(): 
  cin.get(a,20); 
  cin.get(b,20); 
  如果不借助帮助,cin.get(b,20)无法读入,因为 
  换行符留在了输入队列,第二次调用时读的第一个字符便是 
  换行符,所以无法读入新的内容。那么,我们应该如何 
  解决这类问题呢? 
同样的规则,借助不带参数的cin.get();在上例中的两句 
 之间加入cin.get();用它吃掉换行符。 
 3、cin.get(a)就是普通的将数据读入到a中
 例子:
  **************************/  
using namespace std;  
char name[20];  
char club[20];  
cout<<"your name"<<endl;  
cin.get(name,20).get();  
cout<<"your favoiate club"<<endl;  
cin.get(club,20).get();  
cout<<"hello,"<<name<<endl;  
cout<<"This is "<<club<<" for you!"<<endl;  
return 0;  
}  

(4)如果输入一串字符串
   string temp;
getline(cin,temp);
(5)文件输入
  例子:
  
#include "conf.h"
#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <string>
using namespace std;
int load_config(conf_t * config)
{

  ifstream infile;
  infile.open("/home/zys/task/my_tcp_stress/conf/user.conf");


  string temp;
  int i=0;
  while(getline(infile,temp))


  {
 int size=0;
 int index=temp.find(' ');
 string zys=temp.substr(index+1);


 if(i==0){
strncpy(config->ip, zys.c_str(), sizeof(config->ip));  
 }else if(i==1){
config->port=atoi(zys.c_str());
 }else if(i==2){
config->create_tcp_count=atoi(zys.c_str());
 }else if(i==3){
config->send_frequent=strtoull(zys.c_str(),NULL,10);
config->send_frequent*=1000;
if(config->send_frequent>=1000000){
 config->sec=config->send_frequent/1000000;
 config->send_frequent=config->sec*1000000-config->send_frequent;
}else{
 config->sec=0;
}
 }else if(i==4){
config->show_time=atoi(zys.c_str());
 }
 else if(i==5){

strncpy(config->manager_ip, zys.c_str(), sizeof(config->ip)); 
 }
 else if(i==6)
 {
config->manager_port=atoi(zys.c_str());
 }else if(i==7){
  
config->max_tcp_count=atoi(zys.c_str());
 }
 i++;
  }
  infile.close();
return 0;
}
原创粉丝点击