主頁 > 後端開發 > _THROW(out_of_range, "invalid vector<T> subscript"); 的問題

_THROW(out_of_range, "invalid vector<T> subscript"); 的問題

2020-09-21 05:40:14 後端開發


// RF_C2.cpp : 定義控制臺應用程式的入口點。
//

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include "random_forest.h"

using namespace std;


vector<decision_tree*>  alltrees;               // 森林(決策樹集合)
vector<TupleData>       trainAll,train,test; // 樣本集
vector<int>             attributes;         // 屬性集(元素為屬性序號)

int                     trainAllNum = 0;
int                     testAllNum  = 0;
int                     MaxAttr;         // 屬性總數
int                     *ArrtNum={0};               // 屬性個數集(元素為屬性最大值)
unsigned int            F;
int                     tree_num    = 10;      // 決策樹個數
const int               leafattrnum = -1;       // 葉子節點的屬性序號


// 讀入資料
void init(char * trainname, char * testname)
{
    trainAllNum     = readData(trainAll, trainname);
    testAllNum      = readData(test, testname);
    calculate_attributes();
    double temp     = (double)trainAllNum;
    temp            = log(temp)/log(2.0);
    F               = (unsigned int)floor(temp+0.5)+1;
    if(F>MaxAttr) F = MaxAttr;
}

// 初始化訓練樣本子集
void sub_init()
{
    // 選取決策樹的訓練樣本集合
    RandomSelectData(trainAll, train);

    // 計算樣本屬性個數
    calculate_ArrtNum();
}

// 讀資料
int readData(vector<TupleData> &data, const char* fileName)
{
    ifstream fin;
    fin.open(fileName);
    string line;

    int datanum=0;

    // 每行資料作為一個樣本
    while(getline(fin,line))
    {
        TupleData d;
        istringstream stream(line);
        string str;

        // 設定每個樣本的標簽和內容
        while(stream>>str)
        {
            if(str.find('a')==0)
            {
                d.label='a';
            }
 else if(str.find('b')==0)
            {
                d.label='b';
            }
 else if(str.find('c')==0)
            {
                d.label='c';
            }
 else if(str.find('d')==0)
            {
                d.label='d';
            }
 else if(str.find('e')==0)
            {
                d.label='e';
            }
 else if(str.find('f')==0)
            {
                d.label='f';
            }
 else if(str.find('g')==0)
            {
                d.label='g';
            }
 else if(str.find('h')==0)
            {
                d.label='h';
            }
 else if(str.find('i')==0)
            {
                d.label='i';
            }
             else if(str.find('j')==0)
            {
                d.label='j';
            }
            else
            {
                int j=stringtoint(str);
                d.A.push_back(j);
            }
        }

        data.push_back(d);
        datanum++;
    }

    fin.close();
    return datanum;
}

// 生成根節點的訓練樣本子集
void RandomSelectData(vector<TupleData> &data, vector<TupleData> &subdata)
{
    int index;
    subdata.clear();
    int d = 0;
    while (d < trainAllNum)
    {
        index = rand() % trainAllNum;
        subdata.push_back(data.at(index));
        d++;
    }
}

// 計算屬性序列
void calculate_attributes()
{
    // 每個樣本必須具有相同的屬性個數
    TupleData d = trainAll.at(0);
    MaxAttr = d.A.size();
    attributes.clear();

    // 建立屬性集合attributes,元素為屬性序號
    for (int i = 0; i < MaxAttr; i++)
    {
        attributes.push_back(i);
    }

    // 初始化屬性最大值序列,元素為屬性最大值
    ArrtNum = new int[MaxAttr];
}

// 字串轉化為int
int stringtoint(string s)
{
    int sum=0;
    for(int i=0; s[i]!='\0';i++)
    {
        int j=int(s[i])-48;
        sum=sum*10+j;
    }
    return sum;
}

// 計算ArrtNum元素值
void calculate_ArrtNum()
{
    for(int i = 0; i < MaxAttr; i++) ArrtNum[i] = 0;

    // ArrtNum元素值為屬性最大值
    for (vector<TupleData>::const_iterator it = train.begin(); it != train.end(); it++)
    {
        int i = 0;

        for (vector<int>::const_iterator intt=(*it).A.begin(); intt!=(*it).A.end();intt++)
        {
            int valuemax=(*intt)+1;
            if(valuemax>ArrtNum[i]) ArrtNum[i]=valuemax;
            i++;
        }
    }
}

// 計算熵
double Entropy(double p, double s)
{
    double n = s - p;
    double result = 0;
    if (n != 0)
        result += - double(n) / s * log(double(n) / s) / log(2.0);
    if (p != 0)
        result += double(-p) / s * log(double(p) / s) / log(2.0);
    return result;
}

// 訓練一棵決策樹
int creat_classifier(decision_tree *&p, const vector<TupleData> &samples, vector<int> &attributes)
{
    if (p == NULL)
        p = new decision_tree();

    // 根據樣本真實類別,輸出葉子節點類別
    if (Allthesame(samples, 'a'))
    {
        p->node.label = 'a';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
if (Allthesame(samples, 'b'))
    {
        p->node.label = 'b';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
if (Allthesame(samples, 'c'))
    {
        p->node.label = 'c';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
if (Allthesame(samples, 'd'))
    {
        p->node.label = 'd';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
if (Allthesame(samples, 'e'))
    {
        p->node.label = 'e';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
if (Allthesame(samples, 'f'))
    {
        p->node.label = 'f';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
if (Allthesame(samples, 'g'))
    {
        p->node.label = 'g';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
if (Allthesame(samples, 'h'))
    {
        p->node.label = 'h';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
if (Allthesame(samples, 'i'))
    {
        p->node.label = 'i';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
    if (Allthesame(samples, 'j'))
    {
        p->node.label = 'j';
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }
    // 如果屬性序列為空,當前節點就為葉子節點
    if (attributes.size() == 0)
    {
        p->node.label = Majorityclass(samples);
        p->node.attrNum = leafattrnum;
        p->childs.clear();
        return 1;
    }

    // 計算當前節點的最優屬性
    p->node.attrNum = BestGainArrt(samples, attributes);

    // 中間節點無標簽
    p->node.label = ' ';

    // 計算子節點候選屬性集合,候選集合元素越來越少
    vector<int> newAttributes;
    for (vector<int>::iterator it = attributes.begin(); it != attributes.end(); it++)
        if ((*it) != p->node.attrNum)
            newAttributes.push_back((*it));

    // 初始化樣本子集,建立maxvalue個樣本子集,也就說明該節點有maxvalue個子節點
    // 為什么不建立一個閾值,進行二分類?
    int maxvalue = ArrtNum[p->node.attrNum];
    vector<TupleData>* subSamples = new vector<TupleData>[maxvalue];
    for (int i = 0; i < maxvalue; i++)
        subSamples[i].clear();

    // 將樣本集合分為樣本子集
    for (vector<TupleData>::const_iterator it = samples.begin(); it != samples.end(); it++)
    {
        // 對樣本進行分類,分別分到maxvalue個子節點中
        // p->node.attrNum是當前節點的最優屬性序號
        // (*it).A.at(p->node.attrNum)正是子節點的序號
        // 基于當前節點最優屬性,計算當前樣本的歸類
        subSamples[(*it).A.at(p->node.attrNum)].push_back((*it));
    }

    decision_tree *child;
    for (int i = 0; i < maxvalue; i++)
    {
        child = new decision_tree;

        if (subSamples[i].size() == 0)
            child->node.label = Majorityclass(samples);
        else
            creat_classifier(child, subSamples[i], newAttributes);

        p->childs.push_back(child);
    }
    delete[] subSamples;
    return 0;
}








uj5u.com熱心網友回復:


// 計算節點處的資訊增益
int BestGainArrt(const vector<TupleData> &samples, vector<int> &attributes)
{
    int attr, 
        bestAttr = 0,
        s = (int)samples.size();
int z[10]={0};

    // 計算正樣本個數
    for (vector<TupleData>::const_iterator it = samples.begin(); it != samples.end(); it++)
    {
        if ((*it).label == 'a')
            z[0]++;
if ((*it).label == 'b')
            z[1]++;
if ((*it).label == 'c')
            z[2]++;
if ((*it).label == 'd')
            z[3]++;
if ((*it).label == 'e')
            z[4]++;
if ((*it).label == 'f')
            z[5]++;
if ((*it).label == 'g')
            z[6]++;
if ((*it).label == 'h')
            z[7]++;
if ((*it).label == 'i')
            z[8]++;
if ((*it).label == 'j')
            z[9]++;
    }

    double infoD = 0;
    double bestResult = 0;

    // 計算初始熵
    for(int i=0;i<10;i++)
{
infoD += Entropy(z[i], s);
}

    vector<int> m_attributes;

    // 隨機確定候選屬性集
    RandomSelectAttr(attributes, m_attributes);

    // 遍歷屬性(即主題),通過資訊增益篩選最優屬性
    for (vector<int>::iterator it = m_attributes.begin(); it != m_attributes.end(); it++)
    {
        attr            = (*it);
        double result   = infoD;

        // 第attr個屬性的最大屬性值
        int maxvalue    = ArrtNum[attr];

        // 正負樣本集
        int* subP1       = new int[maxvalue];
int* subP2       = new int[maxvalue];
int* subP3       = new int[maxvalue];
int* subP4       = new int[maxvalue];
int* subP5       = new int[maxvalue];
int* subP6       = new int[maxvalue];
int* subP7       = new int[maxvalue];
int* subP8       = new int[maxvalue];
int* subP9       = new int[maxvalue];
int* subP0       = new int[maxvalue];
        int* sub        = new int[maxvalue];

        for (int i = 0; i < maxvalue; i++)
        {
            subP1[i] = 0;
subP2[i] = 0;
subP3[i] = 0;
subP4[i] = 0;
subP5[i] = 0;
subP6[i] = 0;
subP7[i] = 0;
subP8[i] = 0;
subP9[i] = 0;
subP0[i] = 0;
            sub[i]  = 0;
        }

        // 基于特定屬性,對當前訓練樣本進行分類
        // 屬性計算這一步的確沒有,屬性值直接存盤在樣本中
        for (vector<TupleData>::const_iterator jt = samples.begin(); jt != samples.end(); jt++)
        {
            
switch ((*jt).label)
{
case 'a': subP1[(*jt).A.at(attr)]++;break;
case 'b': subP2[(*jt).A.at(attr)]++;break;
case 'c': subP3[(*jt).A.at(attr)]++;break;
case 'd': subP4[(*jt).A.at(attr)]++;break;
case 'e': subP5[(*jt).A.at(attr)]++;break;
case 'f': subP6[(*jt).A.at(attr)]++;break;
case 'g': subP7[(*jt).A.at(attr)]++;break;
case 'h': subP8[(*jt).A.at(attr)]++;break;
case 'i': subP9[(*jt).A.at(attr)]++;break;
case 'j': subP0[(*jt).A.at(attr)]++;break;
default:  break;

}
            sub[(*jt).A.at(attr)]++;
        }

        // 計算特定屬性下資訊增益(相對熵)
        double SplitInfo = 0;
        for(int i = 0; i < maxvalue; i++)
        {
            double partsplitinfo;
            partsplitinfo   = -double(sub[i])/s*log(double(sub[i])/s)/log(2.0);
            SplitInfo       = SplitInfo+partsplitinfo;
        }

        double infoattr = 0;
        for (int i = 0; i < maxvalue; i++)
        {
int temp=subP1[i]+subP2[i]+subP3[i]+subP4[i]+subP5[i]+subP6[i]+subP7[i]+subP8[i]+subP9[i]+subP0[i];
            double partentropy=0;
            partentropy    += Entropy(subP1[i],temp );
partentropy    += Entropy(subP2[i],temp);
partentropy    += Entropy(subP3[i],temp);
partentropy    += Entropy(subP4[i],temp);
partentropy    += Entropy(subP5[i],temp);
partentropy    += Entropy(subP6[i],temp);
partentropy    += Entropy(subP7[i],temp);
partentropy    += Entropy(subP8[i],temp);
partentropy    += Entropy(subP9[i],temp);
partentropy    += Entropy(subP0[i],temp);
            infoattr        = infoattr+((double)(temp)/(double)(s))*partentropy;
        }
        result = result - infoattr;
        result = result / SplitInfo;

        // 尋找最優屬性
        if (result > bestResult)
        {
            bestResult      = result;
            bestAttr        = attr;
        }
        delete[] subP1;
delete[] subP2;
delete[] subP3;
delete[] subP4;
delete[] subP5;
delete[] subP6;
delete[] subP7;
delete[] subP8;
delete[] subP9;
delete[] subP0;
        delete[] sub;
    }

    if (bestResult == 0)
    {
        bestAttr=attributes.at(0);
    }
    return bestAttr;
}

void RandomSelectAttr(vector<int> &data, vector<int> &subdata)
{
    int index;
    unsigned int dataNum=data.size();
    subdata.clear();
    if(dataNum<=F)
    {
        for (vector<int>::iterator it = data.begin(); it != data.end(); it++)
        {
            int attr = (*it);
            subdata.push_back(attr);
        }
    }
    else
    {
        set<int> AttrSet;
        AttrSet.clear();
        while (AttrSet.size() < F)
        {
            index = rand() % dataNum;
            if (AttrSet.count(index) == 0)
            {
                AttrSet.insert(index);
                subdata.push_back(data.at(index));
            }
        }
    }
}

bool Allthesame(const vector<TupleData> &samples, char ch)
{
    for (vector<TupleData>::const_iterator it = samples.begin(); it != samples.end(); it++)
        if ((*it).label != ch)
            return false;
    return true;
}

// 確定節點中哪個類別樣本個數最多
char Majorityclass(const vector<TupleData> &samples)
{
    int  n = 0,temp;
int pp[10]={0};
    for (vector<TupleData>::const_iterator it = samples.begin(); it != samples.end(); it++)
{
        if ((*it).label == 'a')
            pp[0]++;
        else if ((*it).label == 'b')
            pp[1]++;
else if ((*it).label == 'c')
            pp[2]++;
else if ((*it).label == 'd')
            pp[3]++;
else if ((*it).label == 'e')
            pp[4]++;
else if ((*it).label == 'f')
            pp[5]++;
else if ((*it).label == 'g')
            pp[6]++;
else if ((*it).label == 'h')
            pp[7]++;
else if ((*it).label == 'i')
            pp[8]++;
else if ((*it).label == 'j')
            pp[9]++;
}

    for(int i=0;i<10;i++)
{
if(n<pp[i])
{
n=pp[i];
temp=i;
}
}

if (temp==0)
        return 'a';
    else if(temp==1)
        return 'b';
else if(temp==2)
        return 'c';
else if(temp==3)
        return 'd';
else if(temp==4)
        return 'e';
else if(temp==5)
        return 'f';
else if(temp==6)
        return 'g';
else if(temp==7)
        return 'h';
else if(temp==8)
        return 'i';
else if(temp==9)
        return 'j';

}

// 測驗階段
char testClassifier(decision_tree *p, TupleData d)
{
    // 抵達葉子節點
    if (p->node.label != ' ')
        return p->node.label;

    // 節點處最優屬性
    int attrNum = p->node.attrNum;

    // 錯誤樣本
    if (d.A.at(attrNum) < 0)
        return ' ';

    // 確定分支
    return testClassifier(p->childs.at(d.A.at(attrNum)), d);
}

void testData()
{
    for (vector<TupleData>::iterator it = test.begin(); it != test.end(); it++)
    {
        printf("新樣本\n");
      
int s[10]={0,0,0,0,0,0,0,0,0,0};

        for(int i = 0; i < tree_num; i++)
        {
printf("第%d棵樹\n",i);
            char m;
m=testClassifier(alltrees.at(i), (*it));
printf("over");
switch (m)
{
case 'a': s[0]++;break;
case 'b': s[1]++;break;
case 'c': s[2]++;break;
case 'd': s[3]++;break;
case 'e': s[4]++;break;
case 'f': s[5]++;break;
case 'g': s[6]++;break;
case 'h': s[7]++;break;
case 'i': s[8]++;break;
case 'j': s[9]++;break;
default:    break;
}

for(int j=0;j<10;j++)
{
printf("p的第%d個為:%d\n",j,s[j]);
}
        }

        int tt=0,oo=0;
for(int j=0;j<10;j++)
{
if(oo<s[j])
{
oo=s[j];
tt=j;
}
}
if (tt==0)
printf("預測為a");
else if(tt==1)
printf("預測為b");
else if(tt==2)
printf("預測為c");
else if(tt==3)
printf("預測為d");
else if(tt==4)
printf("預測為e");
else if(tt==5)
printf("預測為f");
else if(tt==6)
printf("預測為g");
else if(tt==7)
printf("預測為h");
else if(tt==8)
printf("預測為i");
else if(tt==9)
printf("預測為j");
printf("\n");
printf("實際為%c\n",(*it).label);
    }
}

void freeClassifier(decision_tree *p)
{
    if (p == NULL)
        return;
    for (vector<decision_tree*>::iterator it = p->childs.begin(); it != p->childs.end(); it++)
    {
        freeClassifier(*it);
    }
    delete p;
}

void freeArrtNum()
{
    delete[] ArrtNum;
}

//void showResult()
//{
//    cout << "Train size: "<< trainAllNum<<endl;
//    cout << "Test size: "<<testAllNum<<endl;
//    cout << "True positive: " << TP << endl;
//    cout << "False negative: "<< FN<<endl;
//    cout << "False positive: "<<FP<<endl;
//    cout << "True negative: "<<TN<<endl;
//}

int main( )
{
   srand((unsigned)time(NULL)); 

    // 初始化樣本
init("F:/c.txt", "F:/d.txt");

    // 訓練階段
    for(int i = 0; i < tree_num; i++)
    {
        printf("第 %d 棵決策樹訓練開始\n", i);

        // 每棵樹的訓練樣本子集
        sub_init();

        // 訓練每棵決策樹
        decision_tree * root=NULL;
        creat_classifier(root, train, attributes);

        // 建立森林
        alltrees.push_back(root);

        printf("第 %d 棵決策樹訓練完畢\n", i);
    }

    // 測驗階段
    testData();

    for (vector<decision_tree *>::const_iterator it = alltrees.begin(); it != alltrees.end(); it++)
    {
        freeClassifier((*it));
    }

    freeArrtNum();

    //showResult();

    system("pause");
    return 0;
}

uj5u.com熱心網友回復:

這個程式是在http://www.it165.net/pro/html/201503/37220.html這基礎上改的,想變成一個多分類,一直出現
_THROW(invalid_argument, "invalid vector<T> argument");的錯誤,不一定在第幾棵樹就卡死了,幫忙看看呀,謝謝啦

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/94388.html

標籤:基礎類

上一篇:元旦散分

下一篇:久違了!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more