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());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章