C++ Coding Tricks Note


持续更新ing…


string转C风格char数组:

string A = "1234";
char ch_a[5];
strcpy(ch_a, A.c_str());


*给定目录路径 ,读取该目录下的所有文件

win7下定义的文件句柄类型是long型,在win10下将其改为intptr_t类型即可

// 需include <io.h>
void getFiles( string path, vector<string>& files )
{
    //文件句柄
    long   hFile   =   0;
    //文件信息
    struct _finddata_t fileinfo;
    string p;
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)
    {
        do
        {
            //如果是目录,迭代之
            //如果不是,加入列表
            if((fileinfo.attrib &  _A_SUBDIR))
            {
                if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)
                    getFiles( p.assign(path).append("\\").append(fileinfo.name), files );
            }
            else
            {
                files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
            }
        }while(_findnext(hFile, &fileinfo)  == 0);
        _findclose(hFile);
    }
}

释放指针

void FreePtr(float* array)
{
    if (array != NULL)
    {
        // delete array 清空了array[0]的内存
        // delete[] 就清空了数组所有元素的内存
        delete[] array;
        // 内存清空后数组头指针array就为空指针,因此要置为NULL
        array = NULL;
    }
}

for循环的多重条件写法

for (i=0,j=0; (i<10)&&(j<5); i+=2,j+=1)
{
    // ......
}

二分搜索

bool binarySearch(vector<int> nums, int key){
        int left = 0, right = nums.size() - 1;
        while(left <= right){
            int mid = (right - left) / 2 + left; // 直接使用(left + right) / 2 可能导致溢出
            if(nums[mid] == key)
                return true;
            else if(nums[mid] < key)
                left = mid + 1;
            else
                right = mid - 1;
        }
            return false;    // 没找到
    }

bitset 问题

注意:bitset的下标从右边算起,最右一位的index为0

bitset<5> b(0); // 用0来初始化b, 此时b为00000
b.set(4, 1);    
cout << b << endl;  //输出结果为10000,而不是00001!

vector转以指针表示的数组

vector<int>   v;   

表达式v[0]生产一个指向vector中第一个元素的引用,所以,&v[0]是指向那个首元素的指针。vector中的元素被C++标准限定为存储在连续内存中,就像是一个数组,所以,如果我们想要传递v给这样的C风格的API:

void doSomething(const int* pInts, size_t numInts); 

可以如下调用:

doSomething(&v[0], v.size());    

注意:如果v是空的。如果这样的话,v.size()是0,而&v[0]试图产生一个指向根本就不存在的东西的指针,会报错。一个较安全的方法是这样:

if (!v.empty()) 
  doSomething(&v[0], v.size());   

如果你在一个不好的环境中,你可能会碰到一些半吊子的人物,他们会告诉你说可以用v.begin()代替&v[0],因为(这些讨厌的家伙将会告 诉你)begin返回指向vector内部的迭代器,而对于vector,其迭代器实际上是指针。那经常是正确的,但正如条款50所说,并不总是如此,你 不该依赖于此。begin的返回类型是iterator,而不是一个指针,当你需要一个指向vector内部数据的指针时绝不该使用begin。如果你基 于某些原因决定键入v.begin(),就应该键入&*v.begin(),因为这将会产生和&v[0]相同的指针,这样可以让你有更多 的打字机会,而且让其他要弄懂你代码得人感觉到更晦涩。坦白地说,如果你正在和告诉你使用v.begin()代替&v[0]的人打交道的话,你该 重新考虑一下你的社交圈了。(译注:在VC6中,如果用v.begin()代替&v[0],编译器不会说什么,但在VC7和g++中这么做的话, 就会引发一个编译错误)

检测、创建文件夹

string dir = "/xx/xx/";
string or = "md " + dir;
//access()如果文件有访问权限,返回0,若不存在,返回-1
if (access(dir.c_str(), 0) != 0){
    system(or.c_str());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值