学习遇到问题记录

  • printf输出string问题

string不是c语言内置的

1 for(auto i= m.begin();i!=m.end();i++)//c++11新特性auto
2 {
3     printf("%s %d\n", (i->first).c_str(), i->second);//加上一个c_str()
4     //cout<<i->first<<endl;
5 }
  • C++11中,auto不再是一个存储类型指示符,而是一个自动推导变量的类型。在使用时需要初始化
  • cin与getline

       当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。

 getline 的 C++ 函数。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。

  • map容器

遇到类似这样的代码map[str]++(这段代码里str就一个单词),不懂为啥这样写。现在我的理解大概就是str作为key(map下标),每次遇到新的单词键入就在map上创建插入一个键值,然后它的value设置为0,值加1,每次有新的单词来就都是从1加,后面如果这个单词又来了就value++。

【csdn上有篇文章说这个过程就相当于这些单词构造哈希表,使用map创建的哈希表已经按键值进行了排序,所以序列的顺序已经不再是原始的输入顺序了。】

 

 字符统计测试代码

#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
string str;
getline(cin, str);//连续输入包括空格
map<char, int> mapChar;
for (int i = 0; i < str.size(); i++)
{
mapChar[str[i]]++;
}
cout<<"字符串长度:"<<str.size()<<endl;
cout<<"输出字符"<<str[5]<<"对应的次数"<<mapChar[str[5]]<<endl;//测试
//使用迭代器遍历输出mapChar
for (map<char, int>::const_iterator iter = mapChar.begin(); iter != mapChar.end(); iter++)
{
cout << iter->first << "    " << iter->second << endl;
}
  system("pause");
  return 0;
}
  •  C++中计算长度的函数有四种,它们分别是sizeof() ,size(),strlen(),str.length()


计算字符串长度时size()和length()一样;strlen计算字符串的具体长度(只能是字符串),不包括字符串结束符(‘\0')。返回的是字符个数。sizeof计算声明后所占的内存数(字节大小),不是实际长度。sizeof()是运算符

  •  malloc()和free()

 所有程序都必须预留足够的内存来存储程序使用的数据,可以是自动分配的(int arr[100])这个声明就是预留了100个内存位置;还可以用malloc()分配合适的空闲内存块,返回的是动态分配 内存块的首字节地址。

如果内存分配失败,调用exit()结束程序。

free()函数重要性: 当没有调用free()来释放这块内存时,虽然指向这块空间的指针被销毁了,但是这块空间还在,无法访问了,多次申请空间不释放掉就可能耗尽所有内存——内存泄漏问题。

  • 内存泄漏/内存溢出

无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露(memory leak);程序在申请内存时,没有足够的内存空间供其使用,称为内存溢出(out of memory)。memory leak 最终会造成out of memory。

避免memory leak:

1、尽早释放无用对象的引用。

2、避免在循环中创建对象。

3、使用字符串处理时避免使用String,应使用StringBuffer。

4、尽量少使用静态变量,因为静态变量存放在永久代,基本不参与垃圾回收。

        

 

posted @ 2021-04-17 15:08  七里橙花  阅读(53)  评论(0)    收藏  举报