欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C++?STL模擬實(shí)現(xiàn)vector

 更新時(shí)間:2023年01月10日 09:36:49   作者:叫我小秦就好了  
這篇文章主要為大家詳細(xì)介紹了C++如何模擬實(shí)現(xiàn)STL容器vector,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下

vector 概述

vector 的數(shù)據(jù)結(jié)構(gòu)安排及操作方式,與原生數(shù)組十分相似,兩者唯一的差別在于空間運(yùn)用的靈活性。原生數(shù)組是靜態(tài)空間,一旦配置了就不能改變大小;vector 是動(dòng)態(tài)空間,可以在插入過(guò)程中動(dòng)態(tài)調(diào)整空間大小。vector 的實(shí)現(xiàn)技術(shù),關(guān)鍵在于它對(duì)大小的控制及重新配置時(shí)的數(shù)據(jù)移動(dòng)效率。

在文中,將會(huì)挑選 vector 的一些常用接口來(lái)模擬實(shí)現(xiàn),但并不和標(biāo)準(zhǔn)庫(kù)中實(shí)現(xiàn)方式相同。標(biāo)準(zhǔn)庫(kù)中使用了大量?jī)?nèi)存操作函數(shù)來(lái)提高效率,代碼晦澀難懂,不利用初學(xué)者學(xué)習(xí)。本文實(shí)現(xiàn)方式相對(duì)簡(jiǎn)單,但也需要讀者有一定的 STL 使用經(jīng)驗(yàn)。下面就讓我們開(kāi)始吧。

接口總覽

namespace qgw {
	template <class T>
	class vector {
		typedef T* iterator;
        typedef const T* const_iterator;
		typedef T& reference;
	public:
		// 默認(rèn)成員函數(shù)
		vector();										// 默認(rèn)構(gòu)造函數(shù)
		vector(size_t n, const T& val = T());			// 構(gòu)造 n 個(gè) T 類型對(duì)象
		vector(InputIterator first, InputIterator last);// 用一段區(qū)間構(gòu)造
		vector(const vector<T>& v);						// 拷貝構(gòu)造函數(shù)
		vector<T>& operator=(const vector<T>& v);		// 復(fù)制賦值函數(shù)
		~vector();

		// 迭代器函數(shù)
		iterator begin();
        const_iterator begin() const;
		iterator end();
        const_iterator end() const;

		// 元素訪問(wèn)
		reference operator[](size_t pos);
		const reference operator[](size_t pos) const;
		reference back();
		const reference back() const;

		// 容量
		bool empty() const;
		size_t size() const;
		size_t capacity() const;
		void resize(size_t cnt, T val = T());
		void reserve(size_t cap);

		// 修改
		iterator insert(iterator pos, const T& val);
		void push_back(const T& val);
		iterator erase(iterator pos);
		iterator erase(iterator first, iterator last);
		void pop_back();
		void swap(vector<T>& v);

	private:
		iterator _start;			// 表示目前使用空間的頭
		iterator _finish;			// 表示目前使用空間的尾
		iterator _end_of_storage;	// 表示已分配空間的尾
	};
}

成員變量介紹

vector 中有三個(gè)成員變量,_start 指向使用空間的頭,_finish 指向使用空間的尾,_end_of_storage 指向已分配空間的尾。

由上圖也可以清晰的看出,_finish - _start 就是 size 的大小,_end_of_storage - _start 就是 capacity 的大小。

默認(rèn)成員函數(shù)

構(gòu)造函數(shù)

默認(rèn)構(gòu)造函數(shù)

vector 支持一個(gè)無(wú)參的構(gòu)造函數(shù),在這個(gè)構(gòu)造函數(shù)中我們直接將上文中三個(gè)成員變量初始化為空即可。

/// @brief 默認(rèn)構(gòu)造函數(shù),將指針初始化為空
vector() {                
    _start = nullptr;
    _finish = nullptr;
    _end_of_storage = nullptr;
}

構(gòu)造 n 個(gè) T 類型對(duì)象

vector 支持構(gòu)造 n 個(gè) 值為 val 的對(duì)象。可以先用 reserve開(kāi)辟容量,在調(diào)用 push_back 插入即可。

注意:reserve 改變的是 capacity 的大小,不改變 size 的大小,先開(kāi)辟容量為防止需多次擴(kuò)容降低效率。

/// @brief 構(gòu)造 n 個(gè)值為 val 的對(duì)象
/// @param n 容器的大小
/// @param val 用來(lái)初始化容器元素的值
vector(size_t n, const T& val = T()) {
    _start = nullptr;
    _finish = nullptr;
    _end_of_storage = nullptr;

    reserve(n);
    for (int i = 0; i < n; ++i) {
        push_back(val);
    }
}

一段區(qū)間構(gòu)造

vector 支持使用一段迭代器區(qū)間構(gòu)造,區(qū)間范圍是 [first, last),這里的迭代器不一定要是 vector 的迭代器,只有是具有輸入功能的迭代器都可以。

/// @brief 用給定的迭代器區(qū)間初始化,STL 中的區(qū)間均為左閉右開(kāi)形式,即 [first, last)
/// @tparam InputIterator 所需最低階的迭代器類型,具有輸入功能的迭代器都可以
/// @param first 迭代器起始位置
/// @param last 迭代器終止位置
template< class InputIterator>
    vector(InputIterator first, InputIterator last) {
    _start = nullptr;
    _finish = nullptr;
    _end_of_storage = nullptr;

    // 和上一個(gè)類似,先開(kāi)辟空間,尾減頭即為要開(kāi)辟的個(gè)數(shù)
    reserve(last - first);		
    while (first != last) {
        push_back(*first);
        ++first;
    }
}

析構(gòu)函數(shù)

析構(gòu)函數(shù)的實(shí)現(xiàn)很簡(jiǎn)單,首先檢查容器是否為空,不為空就釋放空間,再把指針置空即可。

注意:因?yàn)槲覀冮_(kāi)辟了連續(xù)的空間,要使用 delete[] 來(lái)釋放空間,對(duì)應(yīng)的也要使用 new[] 來(lái)開(kāi)辟空間。即使我們只開(kāi)辟一個(gè)空間也不能使用 new,否則對(duì)自定義類型在釋放時(shí)程序會(huì)崩潰。

具體原因請(qǐng)看:new 和 delete 為什么要匹配使用

/// @brief 釋放開(kāi)辟的空間
~vector() {
    if (_start != nullptr) {
        // 釋放開(kāi)辟的空間,從此處可以看出,開(kāi)辟空間一定要用 new[]
        // 否則對(duì)于自定義類型程序?qū)?huì)崩潰 
        delete[] _start;
        _start = nullptr;
        _finish = nullptr;
        _end_of_storage = nullptr;
    }
}

拷貝構(gòu)造函數(shù)

下面給出的實(shí)現(xiàn)方法比較簡(jiǎn)單,直接用容器 v 初始化創(chuàng)建一個(gè)臨時(shí)容器 tmp,再交換 tmp 和 this 指針指向就好了。

此時(shí) this 指向的容器是由 v 初始化出來(lái)的,tmp 指向了一個(gè)全空的容器,tmp 出了作用域就銷毀了。

需要注意的是此處一定要先將指針初始化為空,否則交換給 tmp 的指針要是不為空而是隨機(jī)值的話,tmp 銷毀時(shí)調(diào)用析構(gòu)函數(shù)就會(huì)導(dǎo)致程序崩潰。有些 ide(vs 2022) 可能會(huì)自動(dòng)賦空,dev 下就不會(huì),對(duì)指針類型編譯器本來(lái)就不會(huì)處理。

/// @brief 用給定容器初始化
/// @param v 用來(lái)初始化的容器
vector(const vector<T>& v) {
    _start = nullptr;
    _finish = nullptr;
    _end_of_storage = nullptr;

    vector<T> tmp(v.begin(), v.end());
    swap(tmp);
}

復(fù)制賦值函數(shù)

該函數(shù)與拷貝構(gòu)造函數(shù)類似,不同的是這里指針不應(yīng)賦空,否則指針原本指針指向的東西就無(wú)法正確釋放了。

/// @brief 替換容器內(nèi)容
/// @param v 用作數(shù)據(jù)源的另一容器
/// @return *this
vector<T>& operator=(const vector<T>& v) {
    vector<T> tmp(v);
    swap(tmp);
    // 返回值為對(duì)象的引用,為的是可以連續(xù)賦值
    return *this;
}

vector 的迭代器

vector 維護(hù)的是一個(gè)連續(xù)線性空間,不論元素是什么類型,普通指針都可以作為 vector 的迭代器滿足所有的條件,因此元素類型的指針就是 vector 的迭代器。

typedef T* iterator;
typedef const T* const_iterator;

begin 和 end

begin 和 end 獲取的是正向迭代器,begin 指向第一個(gè)元素,end 指向最后一個(gè)元素的下一個(gè)位置,begin++ 是向后即 end 方向移動(dòng)。

對(duì)應(yīng)的還有反向迭代器 rbegin 和 rend,rbegin 指向最后一個(gè)元素,rend 指向第一個(gè)元素的前一個(gè)位置,rbegin++ 是向前即 rend 方向移動(dòng)。兩者對(duì)應(yīng)如下圖,因?yàn)榉聪虻鲝?fù)雜的多,這里就不實(shí)現(xiàn)了。

/// @brief 返回指向 vector 首元素的迭代器
/// @return 指向首元素的迭代器
iterator begin() {
    return _start;
}

// const 版本供 const 容器使用
const_iterator begin() const {
    return _start;
}

/// @brief 返回指向 vector 最后元素后一元素的迭代器
/// @return 指向最后元素下一個(gè)位置的迭代器
iterator end() {
    return _finish;
}

const_iterator end() const {
    return _finish;
}

元素訪問(wèn)

operator[]

vector 也支持向數(shù)組一樣的 [] 訪問(wèn)方式,可以隨機(jī)讀取每個(gè)位置,返回該位置元素的引用。

需要注意的是,該函數(shù)并不做邊界檢查,需程序員自行檢查。

/// @brief 返回位于指定位置 pos 的元素的引用,不進(jìn)行邊界檢查
/// @param pos 要返回的元素的位置
/// @return 到所需元素的引用
reference operator[](size_t pos) {
    return _start[pos];
}

// 與上面的唯一不同就是用于 const 容器
const reference operator[](size_t pos) const {
    return _start[pos];
}

back

back 可以獲取最后一個(gè)元素的引用。

/// @brief 返回到容器中最后一個(gè)元素的引用
/// @return 最后元素的引用
reference back() {
    return *(end() - 1);
}

const reference back() const {
    return *(end() - 1);
}

容量相關(guān)函數(shù)

size

根據(jù)圖可知 _finish - _start 即為 size。

/// @brief 返回容器中的元素?cái)?shù)
/// @return 容器中的元素?cái)?shù)量
size_t size() const {
    return _finish - _start;
}

capacity

由圖可知 _end_of_storage - _start 即為 capacity。

/// @brief 返回容器當(dāng)前已為之分配空間的元素?cái)?shù)
/// @return 當(dāng)前分配存儲(chǔ)的容量
size_t capacity() const {
    return _end_of_storage - _start;
}

empty

檢查是否為空的方法很簡(jiǎn)單,直接比較 _start 是否 _finish 相等即可,相等就為空,返回 true。

/// @brief 檢查容器是否無(wú)元素
/// @return 若容器為空則為 true,否則為 false
bool empty() const {
    return _start == _finish;
}

resize

重設(shè)容器大小以容納 cnt 個(gè)元素。

如果當(dāng)前大小大于 cnt,那么減小容器到它的開(kāi)頭 cnt 個(gè)元素。

如果當(dāng)前大小小于 cnt,那么就調(diào)用 insert 在最后插入 cnt - size() 個(gè) val。

一定要注意,不能只改變 _finish,呢樣會(huì)因沒(méi)調(diào)用析構(gòu)函數(shù)從而引發(fā)內(nèi)存泄漏。你可能會(huì)想,我們會(huì)在最后容器銷毀的時(shí)候調(diào)用它的析構(gòu)函數(shù),它的析構(gòu)函數(shù)中有 delete[],這個(gè)語(yǔ)句會(huì)調(diào)用數(shù)據(jù)的析構(gòu)函數(shù)不會(huì)引起內(nèi)存泄漏。這樣想有一定的道理,但有沒(méi)有可能我們 vector 中一開(kāi)始有 10 個(gè)元素,我們用 resize 將其大小改變?yōu)?5,再調(diào)用 5 次 insert 將其大小變?yōu)?10,最后對(duì)象銷毀調(diào)用析構(gòu)。

如上圖,我們一開(kāi)始有 10 個(gè) int* 類型的元素,分別指向一塊空間,后面 resize 為 5 后又添加了 5 個(gè)新的數(shù)據(jù)(用藍(lán)色標(biāo)識(shí))。當(dāng)我們析構(gòu)的時(shí)候我們會(huì)析構(gòu)下圖中的元素,釋放它們指向的空間,那上圖中的 6、7、8、9、10 呢,沒(méi)辦法,因?yàn)槲覀円呀?jīng)找不到它們的指針了,也就沒(méi)辦法釋放它們的空間了。

/// @brief 重設(shè)容器大小以容納 cot 個(gè)元素
/// @param cnt 容器的大小
/// @param val     用以初始化新元素的值
void resize(size_t cnt, T val = T()) {
    if (cnt < size()) {
        // 新大小小于原來(lái)的,需要將多余的部分刪除掉
        // 不能只改變 _finish 指向,要使用 erase 來(lái)刪除,以便調(diào)用析構(gòu)函數(shù)
        erase(begin() + cnt, end());
    } else {
        // 新空間更大,直接調(diào)用 insert 插入即可
        for (int i = 0; i < cnt - size(); ++i) {
            insert(end(), val);
        }
    }
}

reserve

reserve 用來(lái)預(yù)留存儲(chǔ)空間,如果要 push_back 大量的數(shù)據(jù),可能會(huì)引起多次空間分配,從而多次轉(zhuǎn)移元素浪費(fèi)大量時(shí)間??梢灶A(yù)先開(kāi)辟足夠的空間,減少空間分配的次數(shù),來(lái)提高效率。

注意:

1.若 cap 的值大于當(dāng)前的 capacity,則分配新存儲(chǔ),否則不做任何事,也就是說(shuō) reserve 不會(huì)縮小容量

為什么一定要分配新存儲(chǔ),而不是在原空間之后接一部分新空間(因?yàn)闊o(wú)法保證原空間之后還有足夠的可用空間)

2.同時(shí),capacity 的改變也不會(huì)影響 size 的大小

reserve 擴(kuò)容的思路也比較簡(jiǎn)單,開(kāi)辟一段新空間,將原數(shù)據(jù)拷貝到新空間,釋放舊空間即可。

需要注意的是,一定要在開(kāi)始記錄之前元素的個(gè)數(shù),因?yàn)?_finish 還指向原空間最后一個(gè)有效數(shù)據(jù)的下一個(gè)位置,需要將其更新指向新空間。

/// @brief 增加 vector 的容量到大于或等于 cap 的值    
/// @param cap vector 的新容量
void reserve(size_t cap) {
    size_t len = size();
    if (cap > capacity()) {
        T* tmp = new T[cap];
        if (_start != nullptr) {
            // 如果容器內(nèi)之前有數(shù)據(jù),將數(shù)據(jù)拷貝到新位置
            for (int i = 0; i < size(); ++i) {
                tmp[i] = _start[i];
            }
            delete[] _start;    // 釋放掉舊的空間
        }
        _start = tmp;
    }
    // 指向新的地址空間
    _finish = _start + len;
    _end_of_storage = _start + cap;
}

修改函數(shù)

insert

insert 函數(shù)的功能很多,可以在指定位置插入一個(gè)或多個(gè)值,也可以插入一段區(qū)間。這里我們只實(shí)現(xiàn)插入一個(gè)值的函數(shù),在 pos 前面插入 val。

插入之前首先要檢查容量,不夠就進(jìn)行擴(kuò)容。然后將插入位置之后的數(shù)據(jù)向后挪動(dòng)一個(gè)位置,插入 val 即可。

需要注意的是,擴(kuò)容的話需要提前記錄 pos 之前的元素個(gè)數(shù)。因?yàn)?pos 指向的是之前空間的某個(gè)位置,要將其更新為新空間的地址。

/// @brief 將 val 插入到 pos 迭代器之前
/// @param pos 	將內(nèi)容插入到它前面的迭代器
/// @param val 要插入的元素值
/// @return 指向被插入 val 的迭代器
iterator insert(iterator pos, const T& val) {
    // 檢查參數(shù)是否在合法返回,assert 只在 degug 版本下有效
    assert(pos >= _start && pos <= _finish);

    if (_finish == _end_of_storage) {
        // 首先檢查容量,空間不夠要進(jìn)行擴(kuò)容
        // 先記錄插入位置之前元素個(gè)數(shù)
        size_t len = pos - _start;
        // 第一次開(kāi)辟空間給 10 個(gè),后續(xù)擴(kuò)容為 2 倍
        size_t newCap = capacity() == 0 ? 10 : capacity() * 2;
        reserve(newCap);
        // 更新 pos 在新空間中的位置
        pos = _start + len;
    }

    // 將插入位置之后的所有數(shù)據(jù)向后挪動(dòng)一個(gè)位置
    iterator end = _finish - 1;
    while (end >= pos) {
        *(end + 1) = *end;
        --end;
    }
    *pos = val;
    ++_finish;
    return pos;
}

push_back

push_back 是向容器的最后添加一個(gè)元素,直接調(diào)用 insert 即可。

/// @brief 添加給定元素 val 到容器尾
/// @param val 要添加的元素值
void push_back(const T& val) {
    // 直接調(diào)用 insert 即可
    insert(end(), val);
}

erase

erase 從容器中刪除指定的元素:

1.移除位于 pos 的元素

2.移除范圍 [first, last) 中的元素

移除 pos 位置的元素方法很簡(jiǎn)單,首先調(diào)用該位置的析構(gòu)函數(shù),然后將后面的數(shù)據(jù)向前移動(dòng)一個(gè)位置,最后的 --_finish 就可以了。

/// @brief 從容器擦除指定位置的元素
/// @param pos 指向要移除的元素的迭代器
/// @return 移除元素之后的迭代器
iterator erase(iterator pos) {
    assert(pos >= _start && pos < _finish);
    // 在 pos 位置調(diào)用析構(gòu)函數(shù),釋放資源
    pos->~T();
    // 將 pos 位置之后的的元素都向前移動(dòng)一個(gè)位置
    iterator it = pos + 1;
    while (it != _finish) {
        *(it - 1) = *it;
        ++it;
    }
    --_finish;
    // 此時(shí)的 pos 指向沒(méi)刪除前 pos 位置下一個(gè)元素
    return pos;
}

范圍刪除同樣也很簡(jiǎn)單,首先要計(jì)算出要?jiǎng)h除的個(gè)數(shù),循環(huán)調(diào)用 erase 刪除就可以了。

注:下面這種循環(huán)調(diào)用的方式效率十分低,庫(kù)函數(shù)并沒(méi)有使用這種方法,庫(kù)函數(shù)首先對(duì)要?jiǎng)h除的范圍調(diào)用析構(gòu)函數(shù),然后將區(qū)間后面的數(shù)據(jù)移到前面。這樣就只會(huì)移動(dòng)一次數(shù)據(jù),不向下面需要移動(dòng) cnt 次。

/// @brief 移除一段范圍的元素
/// @param first 要移除的起始范圍
/// @param last 要移除的結(jié)束返回
/// @return 移除的最后一個(gè)元素之后的迭代器
iterator erase(iterator first, iterator last) {
    int cnt = last - first;
    while (cnt--) {
        first = erase(first);
    }
    return first;
}

pop_back

pop_back 用來(lái)刪除容器的最后一個(gè)元素,直接調(diào)用 erase 刪除就行。

/// @brief 移除容器最后一個(gè)元素
void pop_back() {
    erase(_finish - 1);
}

swap

swap 函數(shù)可以用來(lái)交換兩個(gè)容器的內(nèi)容,不過(guò)不用實(shí)際交換數(shù)據(jù),只需要改變兩個(gè)容器指針的指向即可。

/// @brief 交換 this 指向的容器和 v 的內(nèi)容
/// @param v 要交換內(nèi)容的容器
void swap(vector<T>& v) {
    // 直接交換所有指針即可
    std::swap(_start, v._start);
    std::swap(_finish, v._finish);
    std::swap(_end_of_storage, v._end_of_storage);
}

到此這篇關(guān)于詳解C++ STL模擬實(shí)現(xiàn)vector的文章就介紹到這了,更多相關(guān)C++ STL vector內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CMake的簡(jiǎn)單應(yīng)用

    CMake的簡(jiǎn)單應(yīng)用

    這篇文章主要介紹了CMake的簡(jiǎn)單應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 使用C語(yǔ)言判斷英文字符大小寫(xiě)的方法

    使用C語(yǔ)言判斷英文字符大小寫(xiě)的方法

    這篇文章主要介紹了使用C語(yǔ)言判斷英文字符大小寫(xiě)的方法,分別為isupper()函數(shù)和islower()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++類模板以及保存數(shù)據(jù)到文件方式

    C++類模板以及保存數(shù)據(jù)到文件方式

    這篇文章主要介紹了C++類模板以及保存數(shù)據(jù)到文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù)

    C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù)

    這篇文章主要介紹了C++如何計(jì)算二進(jìn)制數(shù)中1的個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++超詳細(xì)梳理基礎(chǔ)知識(shí)

    C++超詳細(xì)梳理基礎(chǔ)知識(shí)

    這篇文章主要介紹了C++基礎(chǔ)概念,? 本次為C++的一個(gè)開(kāi)篇,重點(diǎn)是更好的理解C++相對(duì)于其他編程語(yǔ)言的一個(gè)特性,之后會(huì)持續(xù)更新,本次專欄計(jì)劃是掌握C++的基礎(chǔ)語(yǔ)法以及常用特性,并且從細(xì)節(jié)上去理解,需要的朋友可以參考一下
    2022-06-06
  • Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫(xiě)運(yùn)行C、C++的教程詳解(Windows)【真正的小白版】

    Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫(xiě)運(yùn)行C、C++的教程詳解(Windows

    這篇文章主要介紹了Visual Studio Code (vscode) 配置C、C++環(huán)境/編寫(xiě)運(yùn)行C、C++的教程詳解(Windows)【真正的小白版】,圖文詳解介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 基于C++泛型編程職工管理系統(tǒng)

    基于C++泛型編程職工管理系統(tǒng)

    這篇文章主要介紹了基于C++泛型編程職工管理系統(tǒng),前面介紹到了C++的泛型編程,并實(shí)現(xiàn)了萬(wàn)能容器,不過(guò)那使用的是數(shù)組,今天呢咱帶大家實(shí)踐一下使用泛型技術(shù),結(jié)合單鏈表實(shí)現(xiàn)一個(gè)職工管理系統(tǒng),需要的朋友可以參考一下
    2022-02-02
  • 不要被C++(自動(dòng)生成規(guī)則)所蒙騙

    不要被C++(自動(dòng)生成規(guī)則)所蒙騙

    正如標(biāo)題所說(shuō),我們不要被C++語(yǔ)法中所描述的那些條條框框所“蒙騙”了。的確,相信這些生成規(guī)則不會(huì)對(duì)我們的編程帶來(lái)多大的影響(不會(huì)產(chǎn)生錯(cuò)誤),但是只有了解它們的背后操作,我們才知道編譯器究竟為我們做了什么,感興趣的朋友可以了解下,希望本文對(duì)你有所幫助
    2013-01-01
  • C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫(kù))

    C++實(shí)現(xiàn)拼圖游戲代碼(graphics圖形庫(kù))

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解

    C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解

    這篇文章主要介紹了 C/C++如何獲取當(dāng)前系統(tǒng)時(shí)間的實(shí)例詳解的相關(guān)資料,這里提供了幾種實(shí)現(xiàn)方法,幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08

最新評(píng)論