C或C++语言知识点

一、一些注意点

1、pow函数是慢的,尽量不要使用。

二、具体知识点

1、& 的用法
(1)在定义变量时起引用的作用 参考
引用:它就是指针,两者没有区别。我们可以把引用想象成一个不需要”*”就可以访问变量的指针。

注:参考文章中有一错误,空格防止不了单行定义,每个变量均需要单独。
原文:而int后的一个空格是为了防止(实际防止不了) int * a, b;//实际依旧 a是指针,而b不是。

int t =10,t2 = 20;
int *a = &t;
int * &b = a; # a,b共同
b = &t2; # a与b均指向t2
void sawp(int & a, int &b){ # 也是可以真实交换的
   int t = a;
   a = b;
   b = t;
}

(2)在调用函数时,修改如map类型等复杂的数据结构,可以更高效。参考

第一种:将map作为函数的返回值,在函数内部,声明一个map型的local变量,通过复制的方式,将值传递给返回值,开销比较大。(注:如果我们返回值不是map这种复杂数据类型,而是简单的C++内部类型,那么直接使用第一种方式更妥当。)

map<T1, T2> GetData()

第二种:将map的引用作为函数参数传入,注意没有const修饰符,说明函数可以改变mapTarget的内容,从而达到将计算结果传递给调用者的目的。相比于第一种方式,这里函数不要额外声明local变量并复制返回值,开销小(推荐这种方式)。

bool GetData(map<T1, T2> &mapTarget)

2、map的用法
(1)查找key。有两种方式,m.count(key),m.find(key)参考

if(m.count(key)>0)
{
    return m[key];
}
return null;

iter = m.find(key);
if(iter!=m.end())
{
    return iter->second;
}
return null;

(2)插入元素。参考
用数组方式插入数据,可以覆盖以前的值。(另外也可用insert函数插入)

map<int, string> mapStudent;  
mapStudent[1] = "student_one"; 

(3)遍历。参考1 参考2

map<string,int> m;
map<string,int>::iterator it = m.begin();
while(it != m.end())
{
    cout << iter->first << " : " << iter->second << endl;
    it ++;         
}

3、vector 参考
(1)遍历。

// 通过索引遍历:
for (i = 0; i<v.size(); i++)
{
    cout << v[i] << " ";
}

//迭代器遍历:
for (vInt::const_iterator iter = v.begin(); iter != v.end();iter++)
{
    cout << *iter << " ";
}

4、set的用法 参考1 参考2
前言:set采用的就是一种非常高效的平衡检索二叉树:红黑树。

(1)插入元素,用insert()
insert(key_value); 将key_value插入到set中 ,返回值是pair < set< int >::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。

inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.

// 方式1
set<int> s;
pair<set<int>::iterator,bool> pr;
pr = s.insert(5); 
if(pr.second) //如果插入元素成功。通常情况下,不用pr也没事。
{
    cout<<*pr.first<<endl;
}

// 方式2
int a[] = {1,2,3};
s.insert(a,a+3);

(2)遍历

set<int>::iterator iter;
for(iter = s.begin() ; iter != s.end() ; ++iter)
{
    cout<<*iter<<" ";
}

(3)查找。与map的查找key是同理的两种方法。
count(), 用来查找set中某个某个键值出现的次数。因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
find() ,返回给定值值得定位器,如果没找到则返回end() 指针。

5、STL中的嵌套使用
(1)pair、set嵌套使用

#include <set>
set<pair<int, int>> pairs;
pair<int, int> p;
p.first = word1_id;
p.second = word2_id;
pairs.insert(p);//把pair插入到集合中
if (pairs.find(p) == pairs.end())
    printf("无法找到,不在集合中的意思。");

(2)map、vector嵌套使用 参考

typedef std::map<string, vector<string > > STRING2VECTOR;  

std::vector<string> vec1;  
vec1.push_back("test1_vector1"); 
std::vector<string> vec2;  
vec2.push_back("test2_vector1"); 

std::map<string , vector<string> > testMap;  
testMap.insert(STRING2VECTOR::value_type("10001",vec1));
std::map<string, vector<string> >::iterator map_it = testMap.begin();  

for ( ; map_it != testMap.end(); map_it++)  
{  
    cout<<map_it->first<<"/t";  
    vector<string>::iterator mapvec_itor = map_it->second.begin();  
    for ( ; mapvec_itor !=  map_it->second.end(); mapvec_itor++)  
    {  
        cout<<(*mapvec_itor)<<" ";  
    }  
    cout<<endl;  
}  

6、 \r,\n与\r\n有什么区别?(本博客的ubuntu一文也有) 参考
’\r’是回车,英文是Carriage return,十六进制是d,ascii是13。
’\n’是换行,英文是New line,十六进制是a,ascii是10。

Enter = 回车+换行(\r\n) 注:\r\n连用时,不能调换顺序

unix换行:\n(0x0A)
MAC回车:\r(0x0D)
WIN回车换行:\r\n(0x0D,0x0A)

7、打印输出。
(1)通过打印\r,可以使得本行输出不断被覆盖更新。此法常用来输出进度条,如下。

printf("%cAlpha: %f  Progress: %.2f%%  Words/thread/sec: %.2fk  ", 13, alpha,
                       word_count_actual / (float)(iter * train_words + 1) * 100,
                       word_count_actual / ((float)(now - start + 1) / (float)CLOCKS_PER_SEC * 1000));
fflush(stdout); //可以避免光标在本行导出跳动。固定光标大末尾闪烁。

(2)fflush 参考

作用1:强迫将缓冲区内的数据写回参数stream 指定的文件中。即,能够保证输出到文件上的东西已经完全输出了。因用得比较少,详例请看参考链接的。

stream=fopen("DUMMY.FIL","w");
fflush(stream);

作用2:fflush(stdout) 刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。

猜你喜欢

转载自blog.csdn.net/qimiejia5584/article/details/79063208