学习遇到问题记录
- 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、尽量少使用静态变量,因为静态变量存放在永久代,基本不参与垃圾回收。

浙公网安备 33010602011771号