iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
Software Development

C++ 實務基礎經驗系列 第 13

輔助函式 chrono

  • 分享至 

  • xImage
  •  

輔助函式 chrono

今天來介紹C++11出來的時間函式庫chrono,最初是源自boost的某個專案中,以及字串操作的split,因為這個在C++中都沒有源生的支援,以及replace

環境

環境不免俗的還是使用之前的Dockerfile

docker run -v D:/dvt:/home --name=cpp_dev -itd cpp_dev

chrono

chrono主要功能是拿來做紀錄時間長度,參考以下代碼

#include <iostream>
#include <chrono>

using namespace std;

int main()
{
    // 取得當下時間
    std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
    std::cout << "Hello World\n";
    std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();
    // 取得經過時間,duration能支援nanoseconds(奈秒)、microseconds(微秒)、milliseconds(毫秒)、seconds(秒)、minutes(分)、hours(小時)
    std::cout << "Printing took "
        << std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count()
        << "us.\n";
    
    std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
    // time_point也可以轉成時間戳
    std::time_t now_c = std::chrono::system_clock::to_time_t( now );
    // 然後透過ctime()輸出成時間表示字串
    std::cout << std::ctime( &now_c ) << std::endl;

    return 0;
}

split

其實C語言有提供類似字串分割的功能strtok,但原字串也會變動,所以可以利用string中的findsubstr來做到字串切割的功能

#include <iostream>
#include <string>
#include <vector>

using namespace std;

void split(const string& s, vector<string>& tokens, const string& delimiters = " ")
{
    string::size_type lastPos = s.find_first_not_of(delimiters, 0);
    string::size_type pos = s.find_first_of(delimiters, lastPos);
    while (string::npos != pos || string::npos != lastPos)
    {
        tokens.push_back(s.substr(lastPos, pos - lastPos));
        lastPos = s.find_first_not_of(delimiters, pos);
        pos = s.find_first_of(delimiters, lastPos);
    }
}

int main ()
{
    char str100[] = "Hello world, nice to meet you";
    const char* d = "  ,";
    char *p;
    p = strtok(str100, d);
    
    while (p != NULL) {
        cout << p << endl;
        p = strtok(NULL, d);  
    }

    string text = "Hello world, nice to meet you.";
    vector<string> results;
    split(text, results);
    for (auto &s : results)
    {
        cout << s << endl;
    }    

    return 0;
}

replace

使用代碼參考下方

#include <iostream>
#include <string>

using namespace std;

int main ()
{
    string str = "this is a test string.";
    // 指定位置
    str.replace(0, 4, "that");
    cout << str << endl;

    // 指定iterator
    str.replace(str.begin(), str.begin()+4, "this");
    cout << str << endl;
  return 0;
}

參考

C++11 STL 的時間函式庫:chrono
C/C++ 字串分割的3種方法
cpp string replace


上一篇
第三方套件 libuv
下一篇
輔助函式 crash log
系列文
C++ 實務基礎經驗25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言