ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

编程记忆2.1

2020-12-11 22:32:51  阅读:163  来源: 互联网

标签:begin end string int 编程 char vector 记忆 2.1


1.scanf && cin

  • %lld 对应long型变量 %d 对应 int

  • %lf 对应double型变量

  • 获取输入字符

     char c;
     getchar();  // 如果字符前有一个回车或一个空格就用getchar去掉,或者在前面加\n
     scanf(“%c”,&c);
     
     while((c=cin.get())!=EOF) map[c]++;
    
  • 获取输入字符串

     // 方法一: 在PAT上没这个函数,在VS里可以
     char str[100];
     gets_s(str);// 可以读取空格,回车结束;gets没有了
     int N=strlen(str);
     
     // 方法二
     int num=0;
     char ans[90][90];
     while(scanf("%s",ans[num])!=EOF){num++;}// EOF为-1,num是单词个数
     
     //方法三
     #include<stack>
     stack<string> v;
     string s;
     while(cin>>s)v.push(s);
     cout<<v.pop();
     
     // 方法四
     string name;
     getline(cin,name); // 可读取空格
     
     // 方法五:scanf读入string, 本方法不建议使用,可能会输出多余空格
     string a; a.resize(20);
     scanf("%s",&a[0]);
     
     // 方法六
     char s1[10000];
     cin.getline(s1,100,'\n');
     
     // 方法七
     string name;
     getline(cin,name);
    
  • 循环获取输入,可直接while(cin>>a>>b){}

  • 忽略输入字符

     scanf("%d%*c%d",&a,&b); //输入1n3,a=1,b=3,中间是字符不能是数字,可以是回车空格
    
  • sscanf

     char a[50];
     scanf("%s",a);
     double temp;
     sscanf(a,"lf",&temp); //  读出a中的double到temp
     sprintf(b,"%.2f",temp); //  将temp转化为二位小数的字符b
     
     // 连接功能
     char str[20];
     int a=20984,b=98235;
     ssprintf(str,"%3d%6d",a,b);// 3表示a在str中至少占3位,右对齐,6表示至少占6位
    
  • 忽略回车

     // 一次只能忽略一个
     #include <numeric>
     #include <limits>
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

2. printf && cout

  • %02d 输出2位整数,不足则以0填充,%010d, 输出10位整数不足则以0填充

  • %.10f 输出10位float 或double型小数

  • %s 输出一个char一维数组

     //printf输出string
     string str;cin>>str;
     printf("%s",str.c_str());
    
  • cout填充与精度

 int n=10;char a ='b';
 cout<<setw(n)<<setfill(a)<<a;
 
 int a=100; cout<<fixed<<setprecision(1)<<double(a); // 输出一位小数
  • char a[11]; cin >> a; puts(a); // 即cout<<a;

  • 另一种输出

     #include<iterator>
     int A[] = { 1,4,3,7,10 };
     const int N = sizeof(A) / sizeof(int);
     vector<int> vec(A, A + N);
     ostream_iterator<int> output(cout, " ");
     cout << "Vector vec contains:";
     copy(vec.begin(), vec.end(), output);
    

3. string

  • to_string

    int a=1; string s=to_string(a);
    cout << "0" + to_string(60);
    
  • find

    #include <cctype>
    string s1, s2;
    cin >> s1 >> s2;
    if(s2.find(s1[0]) == string::npos);//find的第二个参数可以是一个整数表示位置
    
  • rbegin

    string n; cin>>n;//从后面遍历到前面
    for(auto it=n.rbegin();it!=n.rend();it++)
        cout<<*it;
    //  string也有begin和end
    

4. fill

  • 二维数组填充

    int e[501][501];
    fill(e[0],e[0]+501*501, 123);
    
  • 一维数组填充

    int dis[501]; fill(dis,dis+501,456);
    
  • setfill()后面一定还要输出一个数据哪怕是一个空字符串!

int n=10;char a ='b';
cout<<setw(n)<<setfill(a)<<a;
  • 字符串填充

    string a,b;cin>>a>>b;
    int lena=a.length(),lenb=b.length();
    if(lena>lenb) b.append(lena-lenb,'0'); // 往b的末尾补0直到与a等长
    else a.append(lenb-lena,'0');
    

5. memcpy && copy

  • 复制数组a给b

    #include<string>
    memcpy(b,a,sizeof(int)*n);
    
    vector<int> a(5,0),b(5,0);
    copy(a.begin(),a.end(),b.begin());
    

6. struct

  • 定义结构体时用了 typedef 的话,结构体定义完后的右括号后面声明的数组不可以用,去掉typedef就可以用那个结构数组了

7. vector + map

  • 赋值
vector<int> o;
o.push_back(123);
cout<<o[0];
cout<<o.size();
o.resize(8,100); // 将第2至第8个元素赋值为100

vector<int> a(5,2); //  长度5,值为2

int in[100]={0};
vector<int> tin(in,in+10); // 把数组in前10个数push到tin里

ans.assign(res.begin(),res.end());// 都是 vector<int>类型
  • 去重

    // 法1
    vector<char> con;
    sort(con.begin(), con.end());
    con.erase(unique(con.begin(), con.end()), con.end()); // 删除重复元素
    con.erase(con.begin()); //  删除第一个元素
    
    // 法2 在插入时检测
    if (count(con.begin(), con.end(), a[i]) == 0)  // 如果不存在
    	con.push_back(a[i++]);
    
  • map A16

    map<string,vector<node>> custom;
    string s;cin>>str;
    vector<node> data(n); 
    //此处省略初始化data[0]
    custom[str].push_back(data[0]);
    
    // 方法1
    for(auto it:custom)
    {
        vector<node> temp=it.second;
        cout<<it.first;
    }
    // 方法二
    map<string, vector<node>>::iterator it;
    for(it=custom.begin();it!=custom.end();it++)
    		 if(it->second==data[0]) cout << it->first <<"  ";
    //注: map用char*做映射和string做映射不同,用char*时每赋值一次就会多一个这样的同名映射而不会合并  见PAT A95
    
  • 二维

    vector<vector<int>> school(m);
    vector<int> school[m];
    vector<<vector<int>> a( m, vector<int>(n));
    
  • 查找

    map<string, int> wordmap; string word="123";
    if(wordmap.find(word) != wordmap.end())
    	          wordmap[word]++;
    
    std::find(wordmap.begin(), wordmap.end(), "China")==wordmap.end();
    
  • 取最后值

    vector<int> path;
    _for(0, 10) path.push_back(i);
    cout << *(path.end()-1);
    
  • 取前k个值(leetcode973)

    vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
    return {points.begin(), points.begin() + k};}
    
  • 插入

    vector<int> v;
    v.push_bavk(123); v.push_back(456);
    v.insert(v.begin()+1,9);// 从第一个元素后插入9
    
  • 删除

    vec.erase(remove(vec.begin(), vec.end(), 3), vec.end());//删除值为3的元素
    

8. memset

  • int c[10]; memset(c,0,40); // 只赋0和-1、1
  • 在库文件cstring和string.h里

9. isxxx

  • isdigit(a[i]) // a[i]是不是数字字符
  • isalpha(c[j]) // c[j]是不是英文字母
  • isupper(b[k])

10. stringstream && substr && stoi &&stof&& atoi &&atof&& toupper

  • 获取子字符串并转数字(1)

    #include <iomanip> // PAT
    #include<sstream> // VS
    stringstream ss;
    ss<<s.substr(5);  // 取子字符串s[5]至s的结尾到容器ss中,
    int evalue;
    ss>>evalue; //转成数字
    
  • 获取子字符串并转数字(2)

    string s; cin>>s;
    string t = s.substr(4,3); //获取子字符串s[4]开始长为3的字符串
    int n = stoi(s.substr(2));// 将s[2]至s的结尾的子字符串转化为数字,可含符号
    float a= stof(s);
    double b= atof(s.c_str());
    
  • 小写转大写

    char a; cin >> a;
    cout << (char)toupper(a);
    string get;cin>>get;
    transform(get.begin(), get.end(), get.begin(), ::tolower);
    
  • atoi() 将char数组转成int

  • 将int转char数组

    int x;  cin>>x;
    char s[100];
    snprintf(s, sizeof(s), "%0100d", x);
    itoa(x,s,10);  //  第三个参数是进制,可能有的不支持
    cout<<x;
    

11. reverse

  • 反转字符串

    string s;cin>>s;
    reverse(s.begin(),s.end());
    
  • 传vector

    vector<int> a(5); a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;
    reverse(begin(a)+2,begin(a)+5);
    

12. sort

  • 快速排序

    bool cmp(int a,int b) {return b>a;} // 降序
    vector<int> v;
    for(int i=0;i<100;i++)v.push_back(rand());
    sort(v.begin(),v.end(),cmp);
    for(int i=0;i<100;i++) cout<<v[i]<<" ";
    
  • 降序

     sort(a, a+n, greater<int>()); // less<int>()
    
  • 简写

    sort(p, p + n, 
         [](const project& p1, const project& p2) {return p1.d < p2.d; });
    
    // 按值传递r0、c0,也可以用&r0
    sort(ret.begin(), ret.end(), [r0,c0](vector<int>& a, vector<int>& b) {
         return abs(a[0] - r0) + abs(a[1] - c0) < abs(b[0] - r0) + abs(b[1] - c0);});
    

13. strcmp

  • int strcmp(const char* s1, const char* b); // s1<s2时返回负数,相等时返回0

    char a[10],c[4]="123";
    //三个a都会输出
    if(strcmp(a,c)==0) cout<<a;
    if(strcmp(a,"123")==0)cout<<a; 
    if(strcmp(a,"123\0")==0)cout<<a; 
    

14. round

  • 四舍五入

    int a,b,c;cin>>a>>b>>c;
    a=round((a+b+c)/3.0)+0.5;
    

15. upper_bound

  • 在数组a中查找第一个超过b的数的下标

    int j=upper_bound(a,a+n,b)-a;
    
  • lower_bound(i) , 返回指向大于等于i的第一个元素的指针,可以用set类型直接调用

16. freopen

  • 打开文件

    freopen("file.in","r",stdin);
    freopen("file.out","w",stdout);
    

17. set

  • 插入

    #include<set>
    set<int> s;
    s.insert(123);
    
  • 删除

     set<node> s;
     auto it = s.find(node{num, book[num]});
     if (it != s.end()) s.erase(it);
    
  • 用于加快查找

    vector<string> wordList;  string t="123";
    unordered_set<string> wordSet(wordList.begin(),wordList.end());
    //if(std::find(wordList.begin(),wordList.end(),t)!=wordList.end()){...}
    if(wordSet.count(t)){...}
    

18. 运算符重载

struct node {
	int value; int cnt;
	bool operator < (const node & a) const{
		return cnt != a.cnt ? cnt > a.cnt:value < a.value;
	}
};
set<node> s; // s插入时会自动调用<排序

19. auto it

// 用箭头
for(auto it = s.begin();it != s.end(); it++)
	printf(" %d", it->value);

// 用小数点
for (auto it : s) 
	cout << " " << it.value;

20. pair

#include<utility>
pair<string, int> name_age("Tom", 18);
name_age.first="Sam";
name_age=make_pair("Bob",19);

21. 优先级队列

priority_queue<pair<int, int>> q;// 大根堆,python是小根堆
q.emplace(197, 0); // 按第一个值建堆,第二个值表示197在原来的数组中的索引
cout<<q.top().first; // 堆顶元素的值最大

auto cmp = [&](const char& letter1, const char& letter2) {
    return counts[letter1 - 'a']  < counts[letter2 - 'a'];
};
// 按cmp排序建大根堆,第二个元素存堆,必须用vector
priority_queue<char, vector<char>,  decltype(cmp)> queue{cmp};
queue.push('a');

22. char处理

  • strcpy

    char* date=new char[9];
    const char* month;
    mon="November";  
    strcpy(date,month);  // const char* 转char*
    

23. max_element&&accumulate

unordered_map<char, int> freq;
int maxExec = max_element(freq.begin(), freq.end(), [](const auto& u, const auto& v) {return u.second < v.second;})->second;
int maxCount = accumulate(freq.begin(), freq.end(), 0, [=](int acc, const auto& u) {return acc + (u.second == maxExec);});  //  maxExec出现次数

其他

  • long double 可用于 [−263,263]的加减法,只用double却不行,A1065

  • ASCII

    Untitled

  • char数组赋值

    char s[14] = {"0123456789JQK"}; //数组长度不可以是c[13],但那下面这种可以是c[13]
    char c[14] = { '0','1','2','3','4','5','6','7','8','9','j','q','k' };
    
  • 声明、初始化和释放string二维动态数组

int n,m; cin>>n>>m; // n行m列的string二维数组
string** ss=new string*[n];
for(int i=0;i<n;i++) ss[i]=new string[m];

// 赋值
string *q=ss[0];   // 1
string *w=*ss;     // 2
string *ww=*ss+2;  // 2
string s[5][6];
string(*e)[6]=s;   // 3 
int b[6]={0};
int *c=b;          // 4

for(int i=0;i<n;i++) delete[] ss[i];
delete[] ss;

vector<<vector<int>> a( m, vector<int>(n));
  • typedef long long ll;

当你走投无路时

  • 考虑变量是否越界访问数组,调大数据表示范围,记得输入(scanf)输出也要改
  • 考虑是否输出有规定位数限制,用 cout 时要用 setw 和 setfill 填充
  • 考虑边界值,比如 +0 与 - 0
  • 看看输出格式,检查单词是否拼错,漏了个字母,大小写
  • 如果在for循环里用了vector的 size() 函数还 -1, 要小心size为 0 时 -1 结果不是负一 ,建议转为int,比如:(int)nums.size() - 1
  • 当用了很多数组或vector、取数组元素时用的下标是另一个数组的值时,要特别注意所代表的含义是否正确

标签:begin,end,string,int,编程,char,vector,记忆,2.1
来源: https://blog.csdn.net/qq_39536393/article/details/111054459

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有