【C++】语法、概念、Bug总结


文章目录

  • 前言
  • 一、基本语法
    • 1.运算符
      • 1.1位运算
      • 1.2 逻辑运算符
    • 2.输入输出
      • 2.1 格式化输出
    • 3.变量/数据类型
      • 3.1数据类型转换
      • 3.2 string
      • 3.3 关键字
    • 5.容器
      • 5.1 set
      • 5.2 map
      • 5.3 vector
      • 5.9 方法
    • 7.函数
    • 8.C语言文件操作
    • 9.C++文件操作
    • 10.指针
      • 10.1vector
    • 11.类
    • 12库
    • 13.其他
    • 14.头文件
  • 二、Bug
  • 三、其他
  • 四、基本概念辨析
  • 总结


前言

  将平时使用C++时遇到的Bug、概念盲区汇总下来,同时也慢慢将语法整理进来,链接内容都是一些优质的博客,后面会持续更新过,欢迎转发关注。


一、基本语法

1.运算符

1.1位运算

  • 异或的逆元

1.2 逻辑运算符

  • C++ 异或运算

2.输入输出

2.1 格式化输出

  • printf 格式化输出右对齐补零

  • printf输出指针内容: printf("%p",s);

  • cin.getline() 和 getline()

//cin.getline()用法:接收一个字符串,可以接收空格并输出
//cin接收一个字符串,遇“空格”、“TAB”、“回车”就结束
#include 
using namespace std;
main ()
{char m[20];cin.getline(m,5);cout<<m<<endl;
}//getline()用法:接收一个字符串,可以接收空格并输出,需包含“#include
#include
#include
using namespace std;
main ()
{string str;getline(cin,str);cout<<str<<endl;
}

3.变量/数据类型

3.1数据类型转换

  • int转string
  • double与string的相互转化(C++)
  • vector转string
#include 
#include 
#include 
#include 
vector<int> vec={1,0,1,1,0};
stringstream ss;
string str;
copy(vec.begin(),vec.end(),ostream_iterator<int>(ss,""));
str=ss.str();
  • vector<string>转string
#include 
#include 
#include     // 函数所在的库
#include 
using namespace std;
int main()
{string strData;vector<string> vec = { "hello world" };strData = accumulate(vec.begin(), vec.end(), strData);cout << strData << endl;
}
//如果是vector中有多个分割开的元素,想要其中某个或者全部拼接为string字符串,
//则使用for循环遍历赋值(累加拼接)。

3.2 string

  • 利用Iterator和erase删除String指定位置的字符
	string s = "abcdefg";int i = 3;string::iterator itr = s.begin();itr+=i;s.erase(itr);s.erase(itr);cout<<s;

这里我们利用string的一个函数erase(iterator)来删除指定位置上的字符,这里的iterator迭代器可以通过string.begin()获得该字符串的首迭代器,再加上不同的数值来进行删除操作。这里我们是想删除"de",由于我们获得了首迭代器并且加了数值,此时删除的是"d",如果再想删除“e”,我们不需要再进行任何数值的增添,因为此时"e"的位置就在刚刚"d"的位置上,只需要再次进行erase()即可。

  • 根据下标和erase删除String指定位置的字符
  • 初始化指定长度字符串:
string result(length, 0);
  • 反转字符串
reverse(a.begin(), a.end());

3.3 关键字

  • enum(C语言-枚举)
  • #iddef #endif
  • throw

5.容器

  • C++的list,stack,queue、set、map等知识汇总

5.1 set

  • 集合set
  • C++ 集合set 详解
  • c++中set的用法;我觉得很详细了,改到窒息
  • set的erase函数
  • set中find()的用法
  • unordered_set用法
    bool hasCycle(ListNode *head) {unordered_set<ListNode*> seen;while (head != nullptr) {if (seen.count(head)) {return true;}seen.insert(head);head = head->next;}return false;}

5.2 map

  • map遍历
  • Map集合如何遍历
  • C++ map用法总结(整理)
  • map和unordered_map的差别和使用
  • C++11 unordered_map详细介绍
  • unordered_map遍历
unordered_map<string , int> save;
string counS;
save[counS]=0;unordered_map<string , int>::iterator it = save.begin();
while(it != save.end()){cout<<it->first<<" "<<it->second<<endl;it++;
}
int main ()
{unordered_map<string,double>myrecipe,mypantry = {{"milk",2.0},{"flour",1.5}};/****************插入*****************/pair<string,double> myshopping ("baking powder",0.3);myrecipe.insert (myshopping);                        // 复制插入myrecipe.insert (make_pair<string,double>("eggs",6.0)); // 移动插入myrecipe.insert (mypantry.begin(), mypantry.end());  // 范围插入myrecipe.insert ({{"sugar",0.8},{"salt",0.1}});    // 初始化数组插入(可以用二维一次插入多个元素,也可以用一维插入一个元素)myrecipe["coffee"] = 10.0;  //数组形式插入display(myrecipe,"myrecipe contains:");/****************查找*****************/unordered_map<string,double>::const_iterator got = myrecipe.find ("coffee");if ( got == myrecipe.end() )cout << "not found";elsecout << "found "<<got->first << " is " << got->second<<"\n\n";/****************修改*****************/myrecipe.at("coffee") = 9.0;myrecipe["milk"] = 3.0;display(myrecipe,"After modify myrecipe contains:");/****************擦除*****************/myrecipe.erase(myrecipe.begin());  //通过位置myrecipe.erase("milk");    //通过keydisplay(myrecipe,"After erase myrecipe contains:");/****************交换*****************/myrecipe.swap(mypantry);display(myrecipe,"After swap with mypantry, myrecipe contains:");/****************清空*****************/myrecipe.clear();display(myrecipe,"After clear, myrecipe contains:");return 0;
}

5.3 vector

  • 获取vector变量首地址
// 取首地址的方法
cout << arrs.data() <<endl;
cout << &arrs[0] <<endl;
cout << &arrs.at(0) << endl;
cout << &arrs.front() << endl;
cout << &*arrs.begin() << endl;
  • vector容器c++11中emplace_back vs push_back

5.9 方法

  • reverse函数:反转容器内容

7.函数

  • C++函数参数的缺省值

8.C语言文件操作

  • fseek(),ftell()

9.C++文件操作

  • fstream进行文件的追加操作

10.指针

10.1vector

  • c++中vector和vector的用法比较

  • C++中vector和vector>有什么区别

  • C++之vector与指针

  • C/C++指针详解之基础篇(史上最全最易懂指针学习指南!!!!)

  • 关于C++函数返回指针的情况

11.类

  • C++中的类模板Template

12库

  • STL中erase()小心使用

13.其他

  • 迭代器(这是我看的关于迭代器最全的文章)
  • C++ move()函数
  • 《C++ Primer》读书笔记第十一章-2-关联容器操作
  • C++中try/catch/throw的使用
  • std::ostringstream的用法
  • C++ stringstream
  • c++ STL中sort函数的三种使用方法
  • STL中replsce()用法
s.replace(i, 1, "%20");//从i位置开始的1个字符替换为%20

14.头文件

#include///sort()函数需要

二、Bug

  • Visual Studio使用OpenCV显示错误error LNK2001: 无法解析的外部符号
  • 解决Win10下_findnext()异常
  • 出现:collect2: error: ld returned 1 exit status的原因之一
  • 编译错误: Line 30: Char 5: fatal error: control may reach end of non-void function [-Wreturn-type] }
  • VS2017出现C4996 ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead.错误
  • new types may not be defined in a return type

三、其他

  • assert有什么作用
  • string::npos的含义
  • 异或的逆元
  • C++标准库算法
  • C++的STL中accumulate的用法
  • c++优先队列(priority_queue)用法详解

四、基本概念辨析

  • C++中STL用法超详细总结
  • c++“声明”和“定义”的区别
  • typedef struct和struct定义结构体的区别
  • free(p)和p=NULL的区别
//举例说明
//收回分配给cur的空间,收回后cur还指向之前的地址,
//不过里面的内容已经被清空是乱码
free(cur);
//赋值为NULL,就是让其指向NULL这个地址,
//但是分配给p的那块内存不会收回去,这样就会造成内存的浪费!
cur = NULL;//标准写法
SLinkList* cur = *ppHead;  //定义结构体指针cur
free(cur);                 //收回其空间
cur = NULL;                //让其指向NULL这个地址
//代码连接:https://blog.csdn.net/meng_lemon/article/details/82053993?spm=1001.2014.3001.5506)
  • 深入理解char * ,char ** ,char a[ ] ,char *a[] 的区别
  • 指针和引用区别
  • String是值传递还是引用传递
  • 字符串指针(string类)
  • C++ string 如何使用指针
  • string与参数引用传递
  • 段错误

总结

后面会持续更新过,欢迎转发关注。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部