トップページに戻る

C++メモ


vectorのmax_size

#include <iostream>
#include <vector>

void main()
{
    std::vector<bool> BoolVect;
    std::vector<int> IntVect;
    std::vector<__int64> Int64Vect;

    std::cout << BoolVect.max_size() << std::endl;
    std::cout << IntVect.max_size() << std::endl;
    std::cout << Int64Vect.max_size() << std::endl;
}

//出力結果
//4294967295
//1073741823
// 536870911


ostream_iteratorのサンプル

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

void main()
{
    std::vector<int> IntVect;
    IntVect.push_back(1);
    IntVect.push_back(2);
    IntVect.push_back(3);

    std::copy(IntVect.begin(),IntVect.end(),std::ostream_iterator<int>(std::cout, ","));
    std::cout << std::endl;
}

//出力結果
1,2,3,


デフォルトコピーコンストラクタでの配列の扱い

デフォルトコピーコンストラクタでは、
ビット単位でインスタンスのコピーが作成されます。
配列であっても、値がコピーされます。(DeepCopyと言える)

#include <stdio.h>

class TestClass{
public:
    int mIntArr[3];
    static const int mIntArrUB = 2;
    void DoPrint(){
        for(int I=0;I<=mIntArrUB;I++){
            printf("mIntArr[%3d] = %3d\n",I,mIntArr[I]);
        }
    }
};

void main()
{
    TestClass Ins1;
    for(int I=0;I<=TestClass::mIntArrUB;I++){
        Ins1.mIntArr[I]=I;
    }
    TestClass Ins2 = Ins1;
    printf("Ins1.mIntArr=%p,&Ins1.mIntArr[1]=%p,&Ins1.mIntArr[2]=%p\n",
        Ins1.mIntArr,Ins1.mIntArr+1,Ins1.mIntArr+2);
    printf("Ins2.mIntArr=%p,&Ins1.mIntArr[1]=%p,&Ins1.mIntArr[2]=%p\n",
        Ins2.mIntArr,Ins2.mIntArr+1,Ins2.mIntArr+2);

    for(int I=0;I<=TestClass::mIntArrUB;I++){
        Ins1.mIntArr[I]=100+I;
    }

    puts("---Ins1---");
    Ins1.DoPrint();
    puts("---Ins2---");
    Ins2.DoPrint();
}

//出力結果
Ins1.mIntArr=0012FF68,&Ins1.mIntArr[1]=0012FF6C,&Ins1.mIntArr[2]=0012FF70
Ins2.mIntArr=0012FF74,&Ins1.mIntArr[1]=0012FF78,&Ins1.mIntArr[2]=0012FF7C
---Ins1---
mIntArr[  0] = 100
mIntArr[  1] = 101
mIntArr[  2] = 102
---Ins2---
mIntArr[  0] =   0
mIntArr[  1] =   1
mIntArr[  2] =   2


C++のPOD構造体

POD構造体とは、C言語の構造体と互換性を持つ構造体のことである。
PODは、Plain Old Dataの略


クラスの、コピーコンストラクタと代入演算子

メソッドの中で
*this = CTestClass(500,600);
という記述は、
コンストラクタの処理と、代入演算子の処理が実行される。

#include <stdio.h>
#include <iostream>

class CTestClass{
    int mA;
    int mB;
    int mC;

public:
    //コンストラクタ
    CTestClass(int pA,int pB){
        mA = pA;
        mB = pB;
        static int cnt =1;
        mC=cnt++;
        std::cout << "コンストラクタを起動" << std::endl;
    };

    //コピーコンストラクタ
    CTestClass(const CTestClass& Another){
        mA = Another.mA;
        mB = Another.mB;
        std::cout << "コピーコンストラクタを起動" << std::endl;
    };

    //代入演算子
    CTestClass &operator=(const CTestClass &Another){
        mA = Another.mA;
        mB = Another.mB;
        std::cout << "代入演算子を起動" << std::endl;
        return *this;
    };

    void TestMethod(){
        std::cout << "*this = CTestClass(500,600)" << std::endl;
        *this = CTestClass(500,600); //コンストラクタと代入演算子を起動
    };
};

void main()
{
    std::cout << "処理1■■■■■■■■■■" << std::endl;
    CTestClass InsTestClass1(100,200);//コンストラクタを起動

    std::cout << "処理2■■■■■■■■■■" << std::endl;
    CTestClass InsTestClass2 = InsTestClass1;//コピーコンストラクタを起動

    std::cout << "処理3■■■■■■■■■■" << std::endl;
    CTestClass InsTestClass3(300,400);//コンストラクタを起動
    InsTestClass3 = InsTestClass1; //代入演算子を起動

    std::cout << "処理4■■■■■■■■■■" << std::endl;
    InsTestClass1.TestMethod();
}

//出力結果
処理1■■■■■■■■■■
コンストラクタを起動
処理2■■■■■■■■■■
コピーコンストラクタを起動
処理3■■■■■■■■■■
コンストラクタを起動
代入演算子を起動
処理4■■■■■■■■■■
*this = CTestClass(500,600)
コンストラクタを起動
代入演算子を起動


日時を出力する関数

#include <iostream>
#include <windows.h>

void OutDate()
{
    SYSTEMTIME stTime;
    GetLocalTime(&lstTime);
    char strTime[100];
    wsprintf(strTime , "日時は、%4d年%2d月%2d日%2d時%2d分%2d秒",
        stTime.wYear , stTime.wMonth , stTime.wDay ,
        stTime.wHour , stTime.wMinute , stTime.wSecond);
    std::cout << strTime << std::endl;
}


next_permutationのサンプル

#include <algorithm>
#include <stdio.h>
#include <string>
#include <vector>

int main()
{
    std::vector<char> CharVect;
    CharVect.push_back('a');
    CharVect.push_back('b');
    CharVect.push_back('c');
    
    do{
        std::string wkStr(CharVect.begin(),CharVect.end());
        puts(wkStr.c_str());
    } while(next_permutation(CharVect.begin(),CharVect.end()));
}

//出力結果
abc
acb
bac
bca
cab
cba