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



前言

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


一、基本语法

1.运算符

1.1位运算

1.2 逻辑运算符

2.输入输出

2.1 格式化输出

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

//getline()用法:接收一个字符串,可以接收空格并输出,需包含“#include<string>”
#include<iostream>
#include<string>
using namespace std;
main ()
{
	string str;
	getline(cin,str);
	cout<<str<<endl;
}

3.变量/数据类型

3.1数据类型转换

#include <iostream>
#include <vector>
#include <iterator>
#include <sstream>
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 <vector>
#include <string>
#include <numeric>    // 函数所在的库
#include <iostream>
using namespace std;
int main()
{
	string strData;
	vector<string> vec = { "hello world" };
	strData = accumulate(vec.begin(), vec.end(), strData);
	cout << strData << endl;
}
//如果是vector<string>中有多个分割开的元素,想要其中某个或者全部拼接为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()即可。

string result(length, 0);
  • 反转字符串
reverse(a.begin(), a.end());

3.3 关键字

5.容器

5.1 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

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";
    else
        cout << "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");    //通过key
    display(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

// 取首地址的方法
cout << arrs.data() <<endl;
cout << &arrs[0] <<endl;
cout << &arrs.at(0) << endl;
cout << &arrs.front() << endl;
cout << &*arrs.begin() << endl;

5.9 方法

7.函数

8.C语言文件操作

9.C++文件操作

10.指针

10.1vector

11.类

12库

13.其他

s.replace(i, 1, "%20");//从i位置开始的1个字符替换为%20

14.头文件

#include<algorithm>///sort()函数需要

二、Bug

三、其他

四、基本概念辨析

//举例说明
//收回分配给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)

总结

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

如果你经常在C++代码中遇到bug,以下是一些建议可以帮助你改进: 1. 仔细检查语法和拼写错误:C++语法和拼写错误非常敏感,一个小错误可能导致整个程序崩溃。请确保你的代码中没有简单的拼写错误或语法错误。 2. 编写清晰的代码:编写易于理解和维护的代码是减少bug的关键。遵循良好的编码规范,使用有意义的变量和函数命名,并进行适当的注释。 3. 使用模块化的设计:将代码分成小的可重用模块,每个模块只负责特定的功能。这样可以提高代码的可读性和可维护性,并且可以更容易地定位和修复bug。 4. 测试你的代码:编写测试用例来验证你的代码是否按预期工作。包括正常情况下的输入、边界条件和异常情况。测试能够帮助你发现潜在的问题和bug,并确保代码在不同情况下都能正确运行。 5. 使用调试工具:利用调试器和其他调试工具来帮助你定位和修复bug。通过设置断点、观察变量值、查看堆栈信息等方式来分析程序执行过程中的问题。 6. 阅读文档和教程:学习和熟悉C++的基本概念语法和常见的编程技巧。阅读官方文档、书籍和学习资源可以帮助你更好地理解语言和避免一些常见的错误。 7. 参考他人的代码和解决方案:在遇到问题时,可以搜索互联网上的解决方案、代码示例和开源项目,借鉴其他人的经验和思路。 最重要的是,持续学习和实践。通过不断练习和积累经验,你将能够逐渐提高自己的编程技能,并减少在C++代码中遇到的bug
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值