最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Opengl?ES之FBO幀緩沖對(duì)象使用詳解

 更新時(shí)間:2022年09月29日 11:52:36   作者:思想覺悟  
這篇文章主要為大家介紹了Opengl?ES之FBO幀緩沖對(duì)象使用詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

FBO介紹

FBO幀緩沖對(duì)象,它的主要作用一般就是用作離屏渲染,例如做Camera相機(jī)圖像采集進(jìn)行后期處理時(shí)就可能會(huì)用到FBO。假如相機(jī)出圖的是OES紋理,為了方便后期處理,
一般先將OES紋理通過FBO轉(zhuǎn)換成普通的2D紋理,然后再通過FBO等增加美顏等其他各種特效濾鏡,最后將FBO一路流送進(jìn)編碼器進(jìn)行編碼,另外一路渲染到屏幕上進(jìn)行預(yù)覽顯示。

FBO總結(jié)起來就是可以暫時(shí)將未處理完的幀不直接渲染到屏幕上,而是渲染到離屏Buffer中緩存起來,在恰當(dāng)?shù)臅r(shí)機(jī)再取出來渲染到屏幕。

FBO(Frame Buffer Object)幀緩沖對(duì)象提供了與顏色緩沖區(qū)(color buffer)、深度緩沖區(qū)(depth buffer)和模版緩沖區(qū)(stencil buffer) ,但并不會(huì)直接為這些緩沖區(qū)分配空間,而只是為這些緩沖區(qū)提供一個(gè)或多個(gè)掛接點(diǎn)。我們需要分別為各個(gè)緩沖區(qū)創(chuàng)建對(duì)象,申請(qǐng)空間,然后掛接到相應(yīng)的掛接點(diǎn)上。

從上圖可以看出FBO中包含了:

  • 多個(gè)顏色附著點(diǎn)(GL_COLOR_ATTACHMENT0、GL_COLOR_ATTACHMENT1...)
  • 一個(gè)深度附著點(diǎn)(GL_DEPTH_ATTACHMENT)
  • 一個(gè)模板附著點(diǎn)(GL_STENCIL_ATTACHMENT)

所謂的顏色附著(紋理附著)就是用于將顏色渲染到紋理中去的意思。后面我們主要介紹FBO的顏色附著。

如何使用FBO

  • 使用函數(shù)glGenFramebuffers生成一個(gè)FBO對(duì)象,保存對(duì)象ID。
  • 使用函數(shù)glBindFramebuffer綁定FBO。
  • 使用函數(shù)glFramebufferTexture2D關(guān)聯(lián)紋理和FBO,并執(zhí)行渲染步驟。后續(xù)如果需要使用FBO的效果時(shí)只需要操作與FBO綁定的紋理即可。
  • 使用函數(shù)glBindFramebuffer解綁FBO,一般在Opengl中ID參數(shù)傳遞0就是解綁。
  • 使用函數(shù)glDeleteFramebuffers刪除FBO。

當(dāng)掛接完成之后,我們?cè)趫?zhí)行FBO下面的操作之前,可以檢查一下FBO的狀態(tài),使用函數(shù)GLenum glCheckFramebufferStatus(GLenum target)檢查。

本著學(xué)以致用的原則,我們將結(jié)合之前的文章,例如紋理貼圖、VBO/VAO、EBO等相關(guān)知識(shí)點(diǎn),使用這些知識(shí)點(diǎn)結(jié)合FBO繪制做一個(gè)實(shí)踐的例子:首先將紋理渲染到FBO上去,然后再將FBO的紋理渲染到屏幕上。

插個(gè)話。。??傆腥吮I用不貼原文鏈接,看看是誰(shuí)。。。

首先上代碼,然后我們挑重要的稍微解讀一下:

FBOOpengl.h

class FBOOpengl:public BaseOpengl{
public:
    FBOOpengl();
    void onFboDraw();
    virtual ~FBOOpengl();
    // override要么就都寫,要么就都不寫,不要一個(gè)虛函數(shù)寫override,而另外一個(gè)虛函數(shù)不寫override,不然可能編譯不過
    virtual void onDraw() override;
    virtual void setPixel(void *data, int width, int height, int length) override;
private:
    void fboPrepare();
    GLint positionHandle{-1};
    GLint textureHandle{-1};
    GLuint vbo{0};
    GLuint vao{0};
    GLuint ebo{0};
    // 本身圖像紋理id
    GLuint imageTextureId{0};
    // fbo紋理id
    GLuint fboTextureId{0};
    GLint textureSampler{-1};
    GLuint fboId{0};
    // 用于fbo的vbo和vao  也可以用數(shù)組的形式,這里為了方便理解先獨(dú)立開來
    GLuint fboVbo{0};
    GLuint fboVao{0};
    int imageWidth{0};
    int imageHeight{0};
};

注意:override作為現(xiàn)代C++的一個(gè)關(guān)鍵字,使用的時(shí)候需要注意一點(diǎn),要么就整個(gè)類的虛函數(shù)都用,要么整個(gè)類的虛函數(shù)都不用,不要一個(gè)虛函數(shù)用override修飾,另外一個(gè)虛函數(shù)又不用override關(guān)鍵字修飾,不然很有可能會(huì)編譯不過的。

在FBOOpengl中為了區(qū)分屏幕渲染和FBO離屏渲染,我們聲明了兩套VAO和VBO。

FBOOpengl.cpp

#include "FBOOpengl.h"
#include "../utils/Log.h"
// 頂點(diǎn)著色器
static const char *ver = "#version 300 es\n"
                         "in vec4 aPosition;\n"
                         "in vec2 aTexCoord;\n"
                         "out vec2 TexCoord;\n"
                         "void main() {\n"
                         "  TexCoord = aTexCoord;\n"
                         "  gl_Position = aPosition;\n"
                         "}";
// 片元著色器
static const char *fragment = "#version 300 es\n"
                              "precision mediump float;\n"
                              "out vec4 FragColor;\n"
                              "in vec2 TexCoord;\n"
                              "uniform sampler2D ourTexture;\n"
                              "void main()\n"
                              "{\n"
                              "    FragColor = texture(ourTexture, TexCoord);\n"
                              "}";
const static GLfloat VERTICES_AND_TEXTURE[] = {
        0.5f, -0.5f, // 右下
        // 紋理坐標(biāo)
        1.0f,1.0f,
        0.5f, 0.5f, // 右上
        // 紋理坐標(biāo)
        1.0f,0.0f,
        -0.5f, -0.5f, // 左下
        // 紋理坐標(biāo)
        0.0f,1.0f,
        -0.5f, 0.5f, // 左上
        // 紋理坐標(biāo)
        0.0f,0.0f
};
// 紋理坐標(biāo)原點(diǎn)在圖片的左上角    又是倒置的?什么鬼?疑惑吧?
//const static GLfloat FBO_VERTICES_AND_TEXTURE[] = {
//        1.0f, -1.0f, // 右下
//        // 紋理坐標(biāo)
//        1.0f,1.0f,
//        1.0f, 1.0f, // 右上
//        // 紋理坐標(biāo)
//        1.0f,0.0f,
//        -1.0f, -1.0f, // 左下
//        // 紋理坐標(biāo)
//        0.0f,1.0f,
//        -1.0f, 1.0f, // 左上
//        // 紋理坐標(biāo)
//        0.0f,0.0f
//};
// 真正的紋理坐標(biāo)在圖片的左下角
const static GLfloat FBO_VERTICES_AND_TEXTURE[] = {
        1.0f, -1.0f, // 右下
        // 紋理坐標(biāo)
        1.0f,0.0f,
        1.0f, 1.0f, // 右上
        // 紋理坐標(biāo)
        1.0f,1.0f,
        -1.0f, -1.0f, // 左下
        // 紋理坐標(biāo)
        0.0f,0.0f,
        -1.0f, 1.0f, // 左上
        // 紋理坐標(biāo)
        0.0f,1.0f
};
// 使用byte類型比使用short或者int類型節(jié)約內(nèi)存
const static uint8_t indices[] = {
        // 注意索引從0開始!
        // 此例的索引(0,1,2,3)就是頂點(diǎn)數(shù)組vertices的下標(biāo),
        // 這樣可以由下標(biāo)代表頂點(diǎn)組合成矩形
        0, 1, 2, // 第一個(gè)三角形
        1, 2, 3  // 第二個(gè)三角形
};
FBOOpengl::FBOOpengl() {
    initGlProgram(ver,fragment);
    positionHandle = glGetAttribLocation(program,"aPosition");
    textureHandle = glGetAttribLocation(program,"aTexCoord");
    textureSampler = glGetUniformLocation(program,"ourTexture");
    LOGD("program:%d",program);
    LOGD("positionHandle:%d",positionHandle);
    LOGD("textureHandle:%d",textureHandle);
    LOGD("textureSample:%d",textureSampler);
    // VAO
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    // vbo
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES_AND_TEXTURE), VERTICES_AND_TEXTURE, GL_STATIC_DRAW);
    // stride 步長(zhǎng) 每個(gè)頂點(diǎn)坐標(biāo)之間相隔4個(gè)數(shù)據(jù)點(diǎn),數(shù)據(jù)類型是float
    glVertexAttribPointer(positionHandle, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *) 0);
    // 啟用頂點(diǎn)數(shù)據(jù)
    glEnableVertexAttribArray(positionHandle);
    // stride 步長(zhǎng) 每個(gè)顏色坐標(biāo)之間相隔4個(gè)數(shù)據(jù)點(diǎn),數(shù)據(jù)類型是float,顏色坐標(biāo)索引從2開始
    glVertexAttribPointer(textureHandle, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float),
                          (void *) (2 * sizeof(float)));
    // 啟用紋理坐標(biāo)數(shù)組
    glEnableVertexAttribArray(textureHandle);
    // EBO
    glGenBuffers(1,&ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
    // 這個(gè)順序不能亂啊,先解除vao,再解除其他的,不然在繪制的時(shí)候可能會(huì)不起作用,需要重新glBindBuffer才生效
    // vao解除
    glBindVertexArray(0);
    // 解除綁定
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    // 解除綁定
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
    LOGD("program:%d", program);
    LOGD("positionHandle:%d", positionHandle);
    LOGD("colorHandle:%d", textureHandle);
}
void FBOOpengl::setPixel(void *data, int width, int height, int length) {
    LOGD("texture setPixel");
    imageWidth = width;
    imageHeight = height;
    glGenTextures(1, &imageTextureId);
    // 激活紋理,注意以下這個(gè)兩句是搭配的,glActiveTexture激活的是那個(gè)紋理,就設(shè)置的sampler2D是那個(gè)
    // 默認(rèn)是0,如果不是0的話,需要在onDraw的時(shí)候重新激活一下?
//    glActiveTexture(GL_TEXTURE0);
//    glUniform1i(textureSampler, 0);
// 例如,一樣的
    glActiveTexture(GL_TEXTURE2);
    glUniform1i(textureSampler, 2);
    // 綁定紋理
    glBindTexture(GL_TEXTURE_2D, imageTextureId);
    // 為當(dāng)前綁定的紋理對(duì)象設(shè)置環(huán)繞、過濾方式
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
    // 生成mip貼圖
    glGenerateMipmap(GL_TEXTURE_2D);
    // 解綁定
    glBindTexture(GL_TEXTURE_2D, 0);
}
void FBOOpengl::fboPrepare(){
    // VAO
    glGenVertexArrays(1, &fboVao);
    glBindVertexArray(fboVao);
    // vbo
    glGenBuffers(1, &fboVbo);
    glBindBuffer(GL_ARRAY_BUFFER, fboVbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(FBO_VERTICES_AND_TEXTURE), FBO_VERTICES_AND_TEXTURE, GL_STATIC_DRAW);
    // stride 步長(zhǎng) 每個(gè)頂點(diǎn)坐標(biāo)之間相隔4個(gè)數(shù)據(jù)點(diǎn),數(shù)據(jù)類型是float
    glVertexAttribPointer(positionHandle, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *) 0);
    // 啟用頂點(diǎn)數(shù)據(jù)
    glEnableVertexAttribArray(positionHandle);
    // stride 步長(zhǎng) 每個(gè)顏色坐標(biāo)之間相隔4個(gè)數(shù)據(jù)點(diǎn),數(shù)據(jù)類型是float,顏色坐標(biāo)索引從2開始
    glVertexAttribPointer(textureHandle, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float),
                          (void *) (2 * sizeof(float)));
    // 啟用紋理坐標(biāo)數(shù)組
    glEnableVertexAttribArray(textureHandle);
    // EBO
    glGenBuffers(1,&ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
    // 這個(gè)順序不能亂啊,先解除vao,再解除其他的,不然在繪制的時(shí)候可能會(huì)不起作用,需要重新glBindBuffer才生效
    // vao解除
    glBindVertexArray(0);
    // 解除綁定
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    // 解除綁定
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
    glGenTextures(1, &fboTextureId);
    // 綁定紋理
    glBindTexture(GL_TEXTURE_2D, fboTextureId);
    // 為當(dāng)前綁定的紋理對(duì)象設(shè)置環(huán)繞、過濾方式
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D, GL_NONE);
    glGenFramebuffers(1,&fboId);
    glBindFramebuffer(GL_FRAMEBUFFER,fboId);
    // 綁定紋理
    glBindTexture(GL_TEXTURE_2D,fboTextureId);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTextureId, 0);
    // 這個(gè)紋理是多大的?
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth, imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
    // 檢查FBO狀態(tài)
    if (glCheckFramebufferStatus(GL_FRAMEBUFFER)!= GL_FRAMEBUFFER_COMPLETE) {
        LOGE("FBOSample::CreateFrameBufferObj glCheckFramebufferStatus status != GL_FRAMEBUFFER_COMPLETE");
    }
    // 解綁
    glBindTexture(GL_TEXTURE_2D, GL_NONE);
    glBindFramebuffer(GL_FRAMEBUFFER, GL_NONE);
}
void FBOOpengl::onFboDraw() {
    fboPrepare();
    glBindFramebuffer(GL_FRAMEBUFFER, fboId);
    // 主要這個(gè)的大小要與FBO綁定時(shí)的紋理的glTexImage2D 設(shè)置的大小一致呀
    glViewport(0,0,imageWidth,imageHeight);
     // FBO繪制
    // 清屏
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glUseProgram(program);
    // 激活紋理
    glActiveTexture(GL_TEXTURE1);
    glUniform1i(textureSampler, 1);
    // 綁定紋理
    glBindTexture(GL_TEXTURE_2D, imageTextureId);
    // VBO與VAO配合繪制
    // 使用vao
    glBindVertexArray(fboVao);
    // 使用EBO
// 使用byte類型節(jié)省內(nèi)存
    glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_BYTE,(void *)0);
    glUseProgram(0);
    // vao解除綁定
    glBindVertexArray(0);
    if (nullptr != eglHelper) {
        eglHelper->swapBuffers();
    }
    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void FBOOpengl::onDraw() {
    // 先在FBO離屏渲染
    onFboDraw();
    // 恢復(fù)繪制屏幕寬高
    glViewport(0,0,eglHelper->viewWidth,eglHelper->viewHeight);
    // 繪制到屏幕
    // 清屏
    glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glUseProgram(program);
    // 激活紋理
    glActiveTexture(GL_TEXTURE2);
    glUniform1i(textureSampler, 2);
    // 綁定紋理
    glBindTexture(GL_TEXTURE_2D, fboTextureId);
    // VBO與VAO配合繪制
    // 使用vao
    glBindVertexArray(vao);
    // 使用EBO
// 使用byte類型節(jié)省內(nèi)存
    glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_BYTE,(void *)0);
    glUseProgram(0);
    // vao解除綁定
    glBindVertexArray(0);
    // 禁用頂點(diǎn)
    glDisableVertexAttribArray(positionHandle);
    if (nullptr != eglHelper) {
        eglHelper->swapBuffers();
    }
    glBindTexture(GL_TEXTURE_2D, 0);
}
FBOOpengl::~FBOOpengl() noexcept {
    glDeleteBuffers(1,&ebo);
    glDeleteBuffers(1,&vbo);
    glDeleteVertexArrays(1,&vao);
    // ... 刪除其他,例如fbo等
}

按照之前Opengl ES之紋理貼圖 一文所說的,在Opengl ES中進(jìn)行紋理貼圖時(shí)直接以圖片的左上角為(0,0)原點(diǎn)進(jìn)行貼圖,以糾正紋理貼圖倒置的問題,那么這次在綁定FBO之后之后我們就這么干,
使用以下的頂點(diǎn)坐標(biāo)和紋理坐標(biāo):

// 紋理坐標(biāo)原點(diǎn)在圖片的左上角    又是倒置的?什么鬼?疑惑吧?
const static GLfloat FBO_VERTICES_AND_TEXTURE[] = {
        1.0f, -1.0f, // 右下
        // 紋理坐標(biāo)
        1.0f,1.0f,
        1.0f, 1.0f, // 右上
        // 紋理坐標(biāo)
        1.0f,0.0f,
        -1.0f, -1.0f, // 左下
        // 紋理坐標(biāo)
        0.0f,1.0f,
        -1.0f, 1.0f, // 左上
        // 紋理坐標(biāo)
        0.0f,0.0f
};

一運(yùn)行,我們驚喜地發(fā)現(xiàn),實(shí)際情況居然和 Opengl ES之紋理貼圖 一文所說的不一樣了,經(jīng)過FBO后的貼圖再渲染到屏幕時(shí),居然圖片是倒置的,如下圖:

這是什么為什么呢?

默認(rèn)情況下,OpenGL ES 通過繪制到窗口系統(tǒng)提供的幀緩沖區(qū),也就是屏幕本身就是一個(gè)默認(rèn)的FBO,而使用FBO進(jìn)行紋理貼圖的時(shí)候需要以真正的紋理坐標(biāo)(原點(diǎn)0,0在圖片的左下角)為基準(zhǔn)進(jìn)行貼圖。因此如果直接使用屏幕進(jìn)行紋理貼圖,其實(shí)是應(yīng)該細(xì)分成兩個(gè)過程的,先以左下角為紋理坐標(biāo)原點(diǎn)進(jìn)行貼圖,然后將貼圖后的屏幕默認(rèn)FBO旋轉(zhuǎn)繞X軸旋轉(zhuǎn)180度與屏幕坐標(biāo)(左上角是坐標(biāo)原點(diǎn))重合,但是這兩個(gè)細(xì)分的過程可以做個(gè)取巧就是直接以左上角為紋理坐標(biāo)原點(diǎn)進(jìn)行貼圖,得到的結(jié)果是一樣的。

但是我們?cè)趩为?dú)使用FBO時(shí),仍應(yīng)該遵循以左下角為紋理坐標(biāo)原點(diǎn)的原則進(jìn)行紋理貼圖。因此我們只需修改一下頂點(diǎn)坐標(biāo)和紋理坐標(biāo),以左下角為紋理坐標(biāo)作為原點(diǎn)進(jìn)行FBO貼圖,然后再將FBO旋繞到屏幕上即可:

// 真正的紋理坐標(biāo)在圖片的左下角
const static GLfloat FBO_VERTICES_AND_TEXTURE[] = {
        1.0f, -1.0f, // 右下
        // 紋理坐標(biāo)
        1.0f,0.0f,
        1.0f, 1.0f, // 右上
        // 紋理坐標(biāo)
        1.0f,1.0f,
        -1.0f, -1.0f, // 左下
        // 紋理坐標(biāo)
        0.0f,0.0f,
        -1.0f, 1.0f, // 左上
        // 紋理坐標(biāo)
        0.0f,1.0f
};

運(yùn)行結(jié)果如圖:

以上就是Opengl ES之FBO幀緩沖對(duì)象使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Opengl ES FBO幀緩沖對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Qt打印信息輸出到日志文件中的兩種方法

    Qt打印信息輸出到日志文件中的兩種方法

    最近在研究把?Qt?的打印信息?輸出的到日志文件中,文件存儲(chǔ)嘗試了2種方法,并通過代碼示例和圖文給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-04-04
  • C++中利用cout和fstream采用非科學(xué)計(jì)數(shù)法輸出

    C++中利用cout和fstream采用非科學(xué)計(jì)數(shù)法輸出

    這篇文章主要介紹了C++中利用cout和fstream采用非科學(xué)計(jì)數(shù)法輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語(yǔ)言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例

    C語(yǔ)言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例

    隊(duì)列只允許一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO的性質(zhì);隊(duì)列可用數(shù)組和鏈表 的方法實(shí)現(xiàn),使用鏈表的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些,因?yàn)槿绻褂脭?shù)組節(jié),出隊(duì)列時(shí)刪去首元素需要將整個(gè)數(shù)組前移,效率比較低
    2023-02-02
  • C++實(shí)現(xiàn)LeetCode(143.鏈表重排序)

    C++實(shí)現(xiàn)LeetCode(143.鏈表重排序)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(143.鏈表重排序),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例

    C語(yǔ)言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例

    這篇文章主要介紹了C語(yǔ)言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C/C++實(shí)現(xiàn)跨文件共享全局變量詳解

    C/C++實(shí)現(xiàn)跨文件共享全局變量詳解

    這篇文章主要為大家詳細(xì)介紹了C/C++如何實(shí)現(xiàn)跨文件共享全局變量,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C語(yǔ)言?如何用堆解決Topk問題

    C語(yǔ)言?如何用堆解決Topk問題

    TopK問題即在N個(gè)數(shù)中找出最大的前K個(gè),這篇文章將詳細(xì)講解如何利用小根堆的方法解決TopK問題,文中代碼具有一定參考價(jià)值,快跟隨小編一起學(xué)習(xí)一下吧
    2021-12-12
  • C語(yǔ)言、C++中的union用法總結(jié)

    C語(yǔ)言、C++中的union用法總結(jié)

    這篇文章主要介紹了C語(yǔ)言、C++中的union用法總結(jié),本文講解了什么是union、C中使用union、當(dāng)union遇到對(duì)象等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 深入解析C++編程中的純虛函數(shù)和抽象類

    深入解析C++編程中的純虛函數(shù)和抽象類

    這篇文章主要介紹了深入解析C++編程中的純虛函數(shù)和抽象類,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++獲取本地時(shí)間常見方法匯總

    C++獲取本地時(shí)間常見方法匯總

    這篇文章主要介紹了C++獲取本地時(shí)間的常見方法,幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論

台湾省| 德江县| 抚宁县| 芦山县| 岫岩| 卓尼县| 泰顺县| 兰考县| 南宁市| 临泉县| 满城县| 筠连县| 建阳市| 灵璧县| 区。| 泸州市| 芜湖县| 广宗县| 大方县| 静安区| 靖宇县| 开平市| 阿尔山市| 达孜县| 兰溪市| 苗栗县| 蕉岭县| 竹北市| 牙克石市| 三台县| 靖远县| 邵东县| 芷江| 嘉荫县| 凌云县| 浦江县| 沾化县| 阳西县| 射洪县| 凯里市| 广南县|