C++ Tips

グローバル変数の初期化

// グローバル領域はゼロクリア保証
int a;
static int b;
int c[10];
//プロシージャ内は、指定をしないと値は未定
hoge()
{
    static int a;   // staticはゼロクリア保証
    int b; // 未定
    int c[10]; // 未定
    static int d[10]; // ゼロクリア
    int e[10] = {}; // ゼロクリア C++のみ
    int f[10] = {1}; // Cで可能。f[0]は1、f[1]~f[9]は常にゼロでクリアされる。

参照型のメンバをもつクラスのコンテナとソート

 
#include "stdio.h"
#include <list>
#include <vector>
#include <algorithm>
#include <functional>

// 参照を持つクラスのswap
namespace {

    struct Hoge {
        int& instance_;
        Hoge(int& i) : instance_(i)
        {}
        Hoge(const Hoge& h) : instance_(h.instance_) {}
#if 0
        Hoge& operator = (Hoge h) {
            swap(h);
            return *this;
        }
        void swap(Hoge& h) {
            std::swap(h.instance_, instance_);  // 参照のswapはできない
        }
#endif

        bool operator < (const Hoge& h) const {
            return instance_ < h.instance_;
        }

    };
#if 0
    inline void swap(Hoge& h1, Hoge& h2) {
        h1.swap(h2);
    }
#endif
    // output用
    void print(const Hoge& h) {
        printf("%d\n", h.instance_);
    }

}
        
int main(int argc, char* argv[])
{
        int i1 = 1;
        int i2 = 2;
        int i3 = 3;
        Hoge h1(i1), h2(i2), h3(i3);
        std::vector<Hoge> vectorhoge;  
//      vectorhoge.push_back(h3); // operator =がないとvector::push_backはでき ない 
//      vectorhoge.push_back(h2);
//      vectorhoge.push_back(h1);
//      std::back_inserter(vectorhoge) = h1;
//      std::sort(vectorhoge.begin(), vectorhoge.end()); // operator =がないと vector::push_backはできない


        std::list<Hoge> listhoge;
        listhoge.push_back(h3);
        listhoge.push_back(h2);
        listhoge.push_back(h1);
        std::back_inserter(listhoge) = h1;
        listhoge.sort();
        std::for_each(listhoge.begin(), listhoge.end(), print);

        return 0;
}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS