您的位置:首页 > 编程语言

编程心得(概括性的、零散的、持续添加的)

2011-11-18 19:50 162 查看
在case中变量的声明和定义不能写成一条语句,如:int a = 10; solution:在case语句下加入{ },限制其作用域;拆分成两条语句:int a; a = 10。
在类的头文件中,尽量少包含其它类的头文件
extern的作用:
被extern “C”修饰的变量和函数是按照C语言方式编译和链接的
extern “C”包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的
extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用
extern int a; 仅仅是一个变量的声明,其并不是在定义变量a,因此不需要为a分配内存空间
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明
与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用
被extern “C”修饰的变量和函数是按照C语言方式编译和链接的
void foo(int x, int y)
c++编译器编译后在符号库中的名字:_foo_int_int,包含了函数名、参数数量、参数类型,从而实现了函数重载
c编译器编译后在符号库中的名字:_foo,只有函数名,故c不支持函数重载

extern的作用:实现C++与C及其它语言的混合编程
在C++中引用C语言中的函数和变量,在C语言的头文件中,对其外部函数只能指定为extern类型,不支持extern“C”声明;在包含C语言头文件时,需进行如下处理

                           extern “C”
                           {  
                                     #include “CExample.h”                         
                              }

 在C中引用C++语言中的函数和变量是,C++头文件需添加extern“C”(但是该函数就不能被重载了),在C文件中将C++中定义的extern“C”函数声明为extern类型      
在C++的实现文件中不能对函数使用extern,如:extern int add(int x, int y)   
4.编程之前,要先确定有哪些类,设计类的接口,理清程序运行的基本思路,然后再开始具体的代码编写。这样在编写过程中,大脑会处于一个清醒的状态,最终既能够提高编程效率,也能很大程度上减少程序bug。(弱弱的说一句:我自己还没做到,但这是我的切身体会,因此我要规范自己的编程习惯)

5. 算法的概念:

P(Polynomial )问题:指一个问题能找到一个在多项式时间内解决它的算法
NP问题:指一个问题可以在多项式时间内被验证
通常所谓的“NP问题”,其实就一句话:证明或推翻P=NP

约化:如果问题A能约化成问题B,就意味着能用解决问题B的算法来解决问题A
NPC(NP-Complete)问题:所有的NP问题能约化成NPC问题,如果能够为一个NPC问题找到一个在多项式时间内解决它的算法,那么所有的NP问题也能解决了
6. 在迭代器中使用“前置式递增”(++n)比使用“后置式递增”(n++),因为后置式递增需要一个额外的临时变量来存储迭代器的原本位置并将它返回
7.容器元素的条件:“三个火枪手”
STL容器中的元素是“value语意”的,把元素插入到容器中时,容器会调用元素的copy构造函数,存储元素的副本。因此STL容器要求元素具有copy构造函数;
STL容器能改变其中元素的值,因此要求元素具有赋值操作符;
STL容器能销毁其中的元素,因此要求元素具有析构函数。
8.对序列式容器调用front、back操作时,容器本身不会检查是否有元素存在,因此在调用时要先判断容器是否为空,empty()

9,在vector容器中插入多个元素时,安插一次比安插多次性能可能要好一些。

10.数组名不是指针:http://21cnbao.blog.51cto.com/109393/120778

11.在析构函数中,要记得将计数器变量设置为0。

12.STL中用两个迭代器指定区间范围时,总是半开半闭区间。[it.begin(), it.end)

13.在vector中调用erase(),不会释放被移除元素之内存,可采用如下办法解决:

cout<<theVector.capacity()<<endl;  //capacity: 3
theVector.erase(theVector.begin());
cout<<theVector.capacity()<<endl;  //capacity: 3
vector<string> v(theVector);
theVector.swap(v);
cout<<theVector.capacity()<<endl;  //capacity: 2

14. STL中iterator的类型:output_iterator、input_iterator、forward_iterator、bidirectional_iterator、random_access_iterator。其中forward_iterator继承

   自input_iterator,bidirectional_iterator继承自forward_iterator,random_access_iterator继承自bidirectional_iterator

15.STL中iterator traits(迭代器特性)包括:value_type、difference_type、iterator_category、pointer、reference,利用这些特性可以针对特定的迭代器进行特化

16.VS2010 STL算法中不支持仿函数按引用传递
4000


//仿函数
class InputValue
{
public:
InputValue(int InitValue)
:m_nCurrentValue(InitValue)
{

}
int operator()()
{
return ++m_nCurrentValue;
}
private:
int m_nCurrentValue;
};
void main()
{
InputValue intValue(1);
vector<int> theVector_1;
vector<int> theVector_2;

generate_n<back_insert_iterator<vector<int> >, int, InputValue&>
(back_inserter(theVector_1), 9, intValue);
PRINT_ELEMENTS(theVector_1);//input 2 3 4 5 6 7 8 9 10

generate_n(back_inserter(theVector_2), 9, intValue);
//in vc6.0, it input 11 12 13 14 15 16 17 18 19
//in vs2010, it input 2 3 4 5 6 7 8 9 10
PRINT_ELEMENTS(theVector_2);//input 2 3 4 5 6 7 8 9 10
}
17. for_each函数会返回其仿函数对象

                      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息