したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

管理人の独り言(プログラミング関連)

1みみず★:2008/08/10(日) 23:28:15
あまりにもプログラミングの内容が増えすぎた。
よって隔離スレの中を更に隔離。

2382774さん:2010/07/14(水) 20:58:28
gcc4.5.1インストール。
まだnullptrは使えないorz...

2383774さん:2010/07/14(水) 21:09:35
64bits版OS使っているから、64bits版MinGWにしたら64bitsバイナリしか吐かないので(コマンドラインで変えられると思うが)、32bits版を入れて試す。
別に64bitsバイナリを吐く32bits or 64bits gccの開発を行っているわけではないんだよね?
---
>The mingw-w64 project is a complete runtime environment for gcc to support binaries native to Windows 64-bit and 32-bit operating systems.

2384774さん:2010/07/14(水) 21:13:12
さて、まずlibstdc++-6.dllを読み込まないようにしなくては。

2385774さん:2010/07/14(水) 21:14:30
C++0x Support in GCC - GNU Project - Free Software Foundation (FSF)
http://gcc.gnu.org/projects/cxx0x.html

2386774さん:2010/07/14(水) 21:26:43
さあ、これがC++0xのHello, World!だ。
-----
#include <iostream>

auto main(int argc, char **argv) -> int{
[]{std::cout << "Hello, World!" << std::endl;}();
return 0;
}
-----
凄く・・・、キモいです・・・

2387774さん:2010/07/14(水) 21:29:22
#include <iostream>
#include <string>

auto main(int argc, char **argv) -> int{
return [](std::string str) -> int{
return std::cout << str << std::endl, 0;
}("Hello, World!");
}

2388774さん:2010/07/14(水) 21:32:51
誰か気持ち悪いHello, World!書いてくれないのかね。
-----
#include <iostream>
#include <string>

auto main(int argc, char **argv) -> int{
std::string str = "Hello, World!";
return [=](std::ostream &os){return os << str << std::endl, 0;}(std::cout);
}

2389774さん:2010/07/14(水) 21:41:20
駄目だ。全然キモくない・・・
-----
#include <iostream>
#include <string>
#include <functional>

auto main(int argc, char **argv) -> int{
using namespace std;
return [](string str){
return [&]{
return [=](ostream &os){
return [&]{
return [=, &os](int ret){
return os << str << endl, ret;
};
};
};
};
}("Hello, World!")()(cout)()(0);
}

2390774さん:2010/07/14(水) 21:47:18
この表示が
2,1,0
には驚いたが、どうせ未定義の動作であるから仕方がない。
-----
#include <iostream>
#include <string>
#include <functional>

using namespace std;

auto CreateCounter(int count = 0) -> function<int(void)>{
return [=]()mutable{
return count++;
};
}

auto main(int argc, char **argv) -> int{
auto c = CreateCounter();
cout << c() << "," << c() << "," << c() << endl;
}

2391774さん:2010/07/14(水) 21:48:50
なんだかんだで、コマンドプロンプト(ターミナル)は疲れる。
VC++最新版が欲しいです。

2392774さん:2010/07/17(土) 22:39:22
GoogleMapsとかは、動かしながらマウスを離すと投げられる。
さて、この判定は如何に行うべきか。

2393774さん:2010/07/17(土) 22:40:52
取り敢えず、mouseupされる直前と、そのいっこ前のmousemoveの速度求めて、それが閾値以上だったら、というので良いのかな。

2394774さん:2010/07/18(日) 00:12:19
thead,tfoodは、表示上全く変わらないので(※1)、利用しなくても良いと思っていましたが、今日IEで印刷していて発覚したことには、IEではthead,tfoodを含むtableが二ページに分割されてしまう場合、それぞれの分割されてしまったそれぞれの表に対してthead,tfoodが付く。
これは、場合によっては非常に良い。
まあ、tfoodに著作権表示とか入れられたらウザイだけですが。
ちゃんとthead,tfood,captionは正しく使いましょう。

※1:
ナローバンド回線だったら、ちゃんとブラウザが実装されている場合に限り、thoodが先に表示されて良いかもしれない。(Yahoo!路線情報だと、下に電車種別の説明が出る。)
他にも、tbodyの中身だけグリグリ移動させることが出来るように出来るかもしれないね。
個人的には、二次元の表を考えていないのが残念である。一番左の列も大切だろ。
ただ、個人的には表の選択の時に、全部選択したつもりだったが、実際はthead,tfoodしか選択していなくて残念な感じに。

2395774さん:2010/07/18(日) 05:54:35
C++;

[&]() -> decltype(C){auto buf = C; C = C + 1; return buf}();

2396774さん:2010/07/19(月) 18:32:48
CSSを解説するサイトは、ファイルに分割する場合に、一行目に文字コードの指定が要ることを書くべきである。

2397774さん:2010/07/20(火) 00:09:32
やりたいこと。
1.PEファイルを手動で読み込む 再配置とか出来てない
2.PEファイルにPEファイルの挿入 未着手
4.WAVを読み込んで、フーリエ級数展開 MIDI化
5.ゲーム(?)
6.OpenCV
7.作曲
8.Webサイト制作 PHP

2398774さん:2010/07/20(火) 02:21:12
メンバポインタと、メンバ関数ポインタがなかなか覚えられない。何故ならば使わないからだ。

2399774さん:2010/07/20(火) 10:52:42
絶対初心者にポインタの宣言を教えるときは、
int *p;
のほうがいいと思うんだがなあ。
某サイトでは上の方法では、int型の*pという変数に見えるらしい。
じゃあ、
int* p, q;
と書いたら、int*型のp, qでいいのかという話である。
別にD言語ならばそれでいいのだが・・・

2400774さん:2010/07/20(火) 15:03:25
絶対採用されないだろうが、lambdaを関数ポインタとして扱えるようにして欲しい。(変数をキャプチャしていないとき。)

2401774さん:2010/07/20(火) 15:07:11
nullptrを使わせろー

2402774さん:2010/07/20(火) 15:07:45
もうg++で開発できるようになったし、VC++いらなくね?

2403774さん:2010/07/20(火) 15:08:22
早くOllyDbgがWin64の実行ファイルもデバッグできるようになればいいんだ!

2404774さん:2010/07/20(火) 15:47:03
C++0xが出たら、一体関数宣言はどうすればいいだろうか。
俺は
auto FuncName() -> void;
と書くべきだと思う。
そういえば、
[]FuncName()->void;と書く案はどうなったのだ?

2405774さん:2010/07/20(火) 16:35:08
問:以下のソースを全く同じ動作をするコードを書け。(定数時間)
-----
auto CTest1::TestFunction(unsigned int a, unsigned int b)->unsigned int{
unsigned int ret = 0;
for(unsigned int i = a; i <= b; ++i){
ret += i;
}
return ret;
}
-----
俺には書けなかった・・・
TestFunction(0xfffffffe, 0xfffffffe);
TestFunction(n, 0xffffffff);
あたりを再現できるかが肝心だな。
多分無理だと思うのだが。

2406774さん:2010/07/20(火) 16:35:46
>>2405
についてはunsigned intは32bitsで。

2407774さん:2010/07/20(火) 16:37:13
こんなことやってて、virtualな関数とそうでない関数の呼び出し速度の違いを計るのを忘れていた。

2408774さん:2010/07/20(火) 16:52:38
-m32とか付けるだけで32bitでコンパイルできる。

2409774さん:2010/07/20(火) 17:16:43
もはや最適化で何をやっているのかが分からない。
-----

CPU Disasm
Address Hex dump Command Comments
004019C1 |. /EB 04 JMP SHORT 004019C7
004019C3 |> |660F6FC5 /MOVDQA XMM0,XMM5
004019C7 |> \660F6FD0 |MOVDQA XMM2,XMM0
004019CB |. 660FFED3 |PADDD XMM2,XMM3
004019CF |. 660F6FF8 |MOVDQA XMM7,XMM0
004019D3 |. 660F6FF2 |MOVDQA XMM6,XMM2
004019D7 |. 660F72D6 01 |PSRLD XMM6,1
004019DC |. 660F73DF 04 |PSRLDQ XMM7,4
004019E1 |. 660F6FE6 |MOVDQA XMM4,XMM6
004019E5 |. 660F73DE 04 |PSRLDQ XMM6,4
004019EA |. 660FF4E0 |PMULUDQ XMM4,XMM0
004019EE |. 660F6F2D 8030 |MOVDQA XMM5,DQWORD PTR DS:[473080]
004019F6 |. 660FF4F7 |PMULUDQ XMM6,XMM7
004019FA |. 660FFEE8 |PADDD XMM5,XMM0
004019FE |. 660F72D0 01 |PSRLD XMM0,1
00401A03 |. 660F6FCA |MOVDQA XMM1,XMM2
00401A07 |. 660F70F6 08 |PSHUFD XMM6,XMM6,08
00401A0C |. 660F70E4 08 |PSHUFD XMM4,XMM4,08
00401A11 |. 660F62E6 |PUNPCKLDQ XMM4,XMM6
00401A15 |. 660F6FF0 |MOVDQA XMM6,XMM0
00401A19 |. 660F73D8 04 |PSRLDQ XMM0,4
00401A1E |. 660FF4F2 |PMULUDQ XMM6,XMM2
00401A22 |. 660FDBCB |PAND XMM1,XMM3
00401A26 |. 660F73DA 04 |PSRLDQ XMM2,4
00401A2B |. 660FF4D0 |PMULUDQ XMM2,XMM0
00401A2F |. 660F70C6 08 |PSHUFD XMM0,XMM6,08
00401A34 |. 660F70D2 08 |PSHUFD XMM2,XMM2,08
00401A39 |. 660F62C2 |PUNPCKLDQ XMM0,XMM2
00401A3D |. 660FEFD2 |PXOR XMM2,XMM2
00401A41 |. 660F76CA |PCMPEQD XMM1,XMM2
00401A45 |. 660FDBE1 |PAND XMM4,XMM1
00401A49 |. 660FDFC8 |PANDN XMM1,XMM0
00401A4D |. 660FEBCC |POR XMM1,XMM4
00401A51 |. 660F7F08 |MOVDQA DQWORD PTR DS:[EAX],XMM1
00401A55 |. 83C0 10 |ADD EAX,10
00401A58 |. 39D0 |CMP EAX,EDX
00401A5A |.^ 0F85 63FFFFFF \JNE 004019C3

2410774さん:2010/07/20(火) 17:18:39
>>2409
多分ベクトル化しているんだろう。

2411774さん:2010/07/20(火) 17:21:31
virtualと非virtualを測定しているが、100000回程度では差がない。

2412774さん:2010/07/20(火) 17:28:01
繰り返し回数を変えたら原因不明のバグに悩まされた。
と思ったら、ただ単にスタック上に変数を取り過ぎただけだった。

2413774さん:2010/07/20(火) 17:31:25
10000000回にしたら、最適化無しで10ms差が出た。
最適化すると25ms差が出たがこれはベクトル化のお陰だと思う。

2414774さん:2010/07/20(火) 17:33:53
更に十倍の繰り返し回数にしたら90強の差になった。(最適化なし)
最適化だと250ms強ぐらい。
妥当な結果過ぎてつまらん。

2415774さん:2010/07/20(火) 17:40:21
差を全部仮想関数呼出のコストだとすると、一回あたり、0.000001msぐらいのコスト。
しかし、実際はインライン化出来ない、繰り返しの時にベクトル化出来ない等様々な残念な点がある。
場合によっては倍かかる場合もあり得る。

2416774さん:2010/07/20(火) 17:40:32
#include <iostream>
#include <cstring>
#include <windows.h>

#define nullptr NULL

class ITest{
public:
virtual auto TestFunction(unsigned int a, unsigned int b)->unsigned int = 0;
};

class CTest1 : public ITest{
public:
virtual auto TestFunction(unsigned int a, unsigned int b)->unsigned int;
};
class CTest2 : public ITest{
public:
virtual auto TestFunction(unsigned int a, unsigned int b)->unsigned int;
};

auto CTest1::TestFunction(unsigned int a, unsigned int b)->unsigned int{
unsigned int ret = 0;
for(unsigned int i = a; i <= b; ++i){
ret += i;
}
return ret;
}

auto CTest2::TestFunction(unsigned int a, unsigned int b)->unsigned int{
if(a <= b){
//普通
unsigned int n = b - a + 1;
unsigned int s = a + b;
if(n & 1){
//項数が奇数
return (s >> 1) * n;
}else{
//項数が偶数
return (n >> 1) * s;
}
}else{
//まず来ない
return 0;
}
}

auto memcpy_ore(void *dust, const void *source, std::size_t size)->void{
char *p = static_cast<char*>(dust);
const char *q = static_cast<const char*>(source);
while(size--)*p++=*q++;
}

auto main(int argc, char **argv)->int{
const unsigned int count = 100000000u;

timeBeginPeriod(1);

CTest1 ct1;
CTest2 ct2;
ITest *it[] = {&ct1, &ct2};

static unsigned int rets[count];
/*
{
DWORD start = timeGetTime();
for(unsigned int i = 0u; i < count; ++i){
rets[i] = ct1.TestFunction(0, i);
}
DWORD end = timeGetTime();

std::cout << "start:" << start << ",end:" << end << "," << (end - start) << "ms" << std::endl;
}

if((DWORD)&rets <= 0xffff){
MessageBox((HWND)&rets, nullptr, nullptr, MB_OK);
}
*/
{
DWORD start = timeGetTime();
for(unsigned int i = 0u; i < count; ++i){
rets[i] = ct2.TestFunction(0, i);
}
DWORD end = timeGetTime();

std::cout << "start:" << start << ",end:" << end << "," << (end - start) << "ms" << std::endl;
}

if((DWORD)&rets <= 0xffff){
MessageBox((HWND)&rets, nullptr, nullptr, MB_OK);
}
/*
{
DWORD start = timeGetTime();
for(unsigned int i = 0u; i < count; ++i){
rets[i] = it[0]->TestFunction(0, i);
}
DWORD end = timeGetTime();

std::cout << "start:" << start << ",end:" << end << "," << (end - start) << "ms" << std::endl;
}

if((DWORD)&rets <= 0xffff){
MessageBox((HWND)&rets, nullptr, nullptr, MB_OK);
}
*/
{
DWORD start = timeGetTime();
for(unsigned int i = 0u; i < count; ++i){
rets[i] = it[1]->TestFunction(0, i);
}
DWORD end = timeGetTime();

std::cout << "start:" << start << ",end:" << end << "," << (end - start) << "ms" << std::endl;
}

if((DWORD)&rets <= 0xffff){
MessageBox((HWND)&rets, nullptr, nullptr, MB_OK);
}

timeEndPeriod(1);
return 0;
}

2417774さん:2010/07/20(火) 18:05:28
std::listとかってどれくらい遅いのだろうか・・・

2418774さん:2010/07/20(火) 18:08:50
仕様を読んでないのがいけないのだろうが、イテレータって持続時間どれだけなんだろうか。
勿論、その要素自体を削除したらそれまでなのは理解できるが、他の要素についてのイテレータは何時まで持つのか。
仕様で規定されているのだろうか。

2419774さん:2010/07/20(火) 19:06:19
Variadic templatesが既に実装されていただと・・・

2420774さん:2010/07/20(火) 19:07:53
遊ぶしか無いではないか。
取り敢えず、Wikipediaの例をコピペしてみる。

2421774さん:2010/07/20(火) 19:10:08
Wikipediaの情報古いな。

2422774さん:2010/07/20(火) 19:20:41
多分。

2423774さん:2010/07/20(火) 21:06:12
ものすごく利用できそうなのに、何も思いつかない。
テスト勉強をしろということか。

2424774さん:2010/07/20(火) 21:22:10
ココを押えておけばCSS3がだいたい分かるツール集 | 日刊ウェブログ式
http://toshiiy.blog22.fc2.com/blog-entry-112.html
-----
ベンダーコードを付けないといけない理由が理解出来ない。

2425774さん:2010/07/20(火) 21:42:11
なぜ,/var や /etc が /etc や /cfg というディレクトリ名ではないのか? - NO!と言えるようになりたい
http://d.hatena.ne.jp/ytakano/20100715/1279219401

2426774さん:2010/07/20(火) 21:50:40
Google JavaScript Style Guide 和訳 &mdash; Google JavaScript Style Guide 和訳 v0.1 documentation
http://cou929.nu/data/google_javascript_style_guide/
-----
自分は関数名の初めは大文字にする派。
クラスの最初の文字は、Cとかにするかもしれない。大抵はしないが。

2427774さん:2010/07/20(火) 22:03:53
さっきまで、どうしてpop_back()がないのか、とかアホなことを思っていた。
そりゃ、無いわ。

2428774さん:2010/07/20(火) 22:04:47
違う。
どうして、pop_back()の時に元々一番最後の要素を何故返さないのか?ということを疑問に思っていたが、そりゃ返さない方がいいに決まっているだろう、ということが今わかった。

2429774さん:2010/07/20(火) 22:05:48
でも、std::vector<T>のTがint,char,int*,char*...etc.だったら返して欲しいなあ。

2430774さん:2010/07/20(火) 22:06:52
back(),front()を使えと言っているのは分かります。
しかし、タイプ量が(ry

2431774さん:2010/07/20(火) 22:14:22
Standard Template Library Programmer's Guide
http://www.sgi.com/tech/stl/

2432774さん:2010/07/20(火) 22:32:28
std::list::iteratorを使った走査はポインタを利用してるだけあって早いな。
十分1ms以下で行える(100000個)。
ちなみに10000000個でやったら平均50msぐらい。

2433774さん:2010/07/20(火) 22:41:00
100000000個にしたら、予想通りメモリが足りなかった。(32bits)
64bitsにしたら、動いた。
恐らく、動作終了後物理メモリは綺麗になっただろう(笑)
結局、77184msかかっている。
かかりすぎである。

2434774さん:2010/07/20(火) 23:18:40
どっかの誰かが、C++でソース中にdeleteが出てくるのがおかしい、と言っていました。
確かにその通りだよな。速度を優先していないならば。
どうでもいいが、std::list<std::unique_ptr<T>>って結構使えるんじゃね?

2435774さん:2010/07/20(火) 23:35:47
std::list<std::auto_ptr<T>>だし。

2436774さん:2010/07/20(火) 23:40:09
C++0xでunique_ptrが新しく出来るのだが、所有権の移動がstd::move(正確には右辺値参照?)で行われるらしい。
std::list<unique_ptr<T>>は利用出来るのかな?

2437774さん:2010/07/20(火) 23:47:39
-----
>なのでもちろんstd::vectorには入れられません。
>しかしこういうときはstd::shared_ptrを使うので問題ありませんね。
-----
明らかにlist中でしかメモリ確保しない場合にはオーバースペックすぎるだろ。

2438774さん:2010/07/20(火) 23:53:46
日記帳だ! with Tux on Libserver :: 破壊的コピーは速かった、unique_ptrも速かった
http://hdmr.org/d/?e=483
-----
このページのサンプルソースはバグを孕んでいる(らしい)。
-----
[迷信] アルゴリズム関数内で関数オブジェクトはコピーされない | 株式会社きじねこ
http://www.kijineko.co.jp/tech/superstitions/functor-is-not-copied-in-algorithm.html

2439774さん:2010/07/20(火) 23:55:48
是非ともstd::vector<>,std::list<>系のSTLの.push_back()やらの要素追加系の関数は、右辺値参照(だったか?)をとるようにして欲しい、と言うかなっているだろう。
なっていなかったら幻滅である。なっていないならば、俺の予想を超越する駄目な理由があるだろう(笑)

2440774さん:2010/07/21(水) 00:13:30
仕様に当たろう。
それが一番確実である。

2441774さん:2010/07/21(水) 00:21:43
// 23.3.4.3 modifiers:
template <class... Args> void emplace_front(Args&&... args);
void pop_front();
template <class... Args> void emplace_back(Args&&... args);
void push_front(const T& x);
void push_front(T&& x);
void push_back(const T& x);
void push_back(T&& x);
void pop_back();

2442774さん:2010/07/21(水) 00:22:37
おお、直接コンストラクタまで呼び出せるemplace_back(front)まで用意されているぜ!
折角だから、俺はemplace_backを使うぜ!

2443774さん:2010/07/21(水) 00:23:50
正直、これぐらいしか、なんとかtemplateは使いどころがない。

2444774さん:2010/07/21(水) 00:24:46
つまり、>>2437は嘘である。
因みに、>>2437>>2438と同じサイト。

2445774さん:2010/07/21(水) 00:25:26
>>2444は多分。
まだ検証していない。

2446774さん:2010/07/21(水) 00:32:46
一発でコンパイルが通らなかった&長すぎで読む気にならない。

2447774さん:2010/07/21(水) 00:33:59
あ、通ったらびっくり。
多態性で遊ぼうと思ったのに、interfaceを継承していないもん。

2448774さん:2010/07/21(水) 00:37:31
__func__の定義を読んでいないので、正確にはなんとも言えないのだが、gccでは、クラス名が表示されない。
CClass::CClass(int)中で__func__とやってもCClassとしか表示されないのがgcc。
独自拡張でもいいから、CClass::CClassとだして欲しい。あわよくば、CClass::CClass(int)。
へ?__LINE__使えって?

2449774さん:2010/07/21(水) 00:41:06
デストラクタが呼ばれないと思ったら、デストラクタを仮想化してなかった。
怖い怖い。

2450774さん:2010/07/21(水) 00:43:23
あれ、純仮想デストラクタって出来ないのか・・・?
細かいところ勉強不足だなあ。

2451774さん:2010/07/21(水) 00:44:00
というか、純粋(ryなのか。

2452774さん:2010/07/21(水) 00:44:33
まあ、つまらないサンプル。
-----

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

#define nullptr NULL

class ITest{
public:
virtual auto Show()->void = 0;
virtual ~ITest(){
}
};

class CTest1 : public ITest{
private:
int m_num;

public:
CTest1(int num)
: m_num(num)
{
std::cout << "CTest1::CTest1(int)" << std::endl;
}
virtual ~CTest1(){
std::cout << "CTest1::~CTest1()" << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest1," << m_num << std::endl;
}
};
class CTest2 : public ITest{
private:
double m_num;

public:
CTest2(double num)
: m_num(num)
{
std::cout << "CTest2::CTest2(double)" << std::endl;
}
virtual ~CTest2(){
std::cout << "CTest2::~CTest2()" << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest2," << m_num << std::endl;
}
};

auto WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int /*nCmdShow*/)->int{
timeBeginPeriod(1);
{
std::list<std::unique_ptr<ITest>> ls;
ls.emplace_back(new CTest1(100));
ls.emplace_back(new CTest2(100.));
}
timeEndPeriod(1);
return 0;
}

2453774さん:2010/07/21(水) 00:45:40
>>2452
勿論動くサンプルです。
全然unique_prtが動かないことはないです。

2454774さん:2010/07/21(水) 00:50:13
上のサイトによれば、unique_ptrはほぼ生のポインタと同コストのようなのでこれはかなり使える。と思う。

2455774さん:2010/07/21(水) 00:55:00
某所で、
std::vector<int*> vec;
vec.push_back(new int(100));//ここ危ない。
という話があった。push_back関数内で例外が投げられた時に、newで確保されたメモリが開放されないと。

2456774さん:2010/07/21(水) 00:55:32
>>2455
は違う。

2457774さん:2010/07/21(水) 00:55:59
std::shared_ptr<int> p(new int);
だよ!

2458774さん:2010/07/21(水) 00:56:48
俺が使う範囲ではshared_ptr&weak_ptrはオーバースペックだろう。

2459774さん:2010/07/21(水) 00:59:48
大体、上に書いたソースを読めば、俺がC++を使いこなしていないことが良く分かる。
普通にstd::for_each使えばいいのにね。

2460774さん:2010/07/21(水) 01:19:38
コンテナ系STLを最適化するんだったら、アロケータを自分で作ったほうがいいのか?

2461774さん:2010/07/21(水) 01:20:32
3986 :774さん:2010/07/21(水) 01:01:32
std::for_each(ls.begin(), ls.end(), [](std::unique_ptr<ITest> &p){
p->Show();
});
ん・・・。
これは普通にiteratorで書いたほうがいいか・・・

3987 :774さん:2010/07/21(水) 01:14:54
ちゃんとlist::eraseで消しても、デストラクタが呼ばれるし、他のイテレータも有効だなあ。
イテレータの件については標準なのか調べてみる。明日、テストだし寝る。
-----
#include <iostream>
#include <windows.h>
#include <list>
#include <memory>
#include <algorithm>

#define nullptr NULL

class ITest{
public:
virtual auto Show()->void = 0;
virtual auto IsEven()->bool = 0;
virtual ~ITest(){
}
};

class CTest1 : public ITest{
private:
int m_num;

public:
CTest1(int num)
: m_num(num)
{
std::cout << "CTest1::CTest1(int)" << std::endl;
}
virtual ~CTest1(){
std::cout << "CTest1::~CTest1(), m_num = " << m_num << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest1::Show(), m_num = " << m_num << std::endl;
}
virtual auto IsEven()->bool{
return !static_cast<bool>(m_num & 1);
}
};
class CTest2 : public ITest{
private:
double m_num;

public:
CTest2(double num)
: m_num(num)
{
std::cout << "CTest2::CTest2(double)" << std::endl;
}
virtual ~CTest2(){
std::cout << "CTest2::~CTest2(), m_num = " << m_num << std::endl;
}

virtual auto Show()->void{
std::cout << "CTest2::Show(), m_num = " << m_num << std::endl;
}
virtual auto IsEven()->bool{
return !static_cast<bool>(static_cast<int>(m_num) & 1);
}
};

auto WINAPI WinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int /*nCmdShow*/)->int{
std::list<std::unique_ptr<ITest>> ls;
for(int i = 0; i < 10; ++i){
ls.emplace_back(new CTest1(i));
ls.emplace_back(new CTest2(static_cast<double>(i)));
}

for(auto itn = ls.begin(), it = itn++ , end = ls.end(); it != end; it = itn, ++itn){
if((*it)->IsEven()){
ls.erase(it);
}
}

return 0;
}

3988 :774さん:2010/07/21(水) 01:17:09
g++ main.cpp -std=c++0x -O3 -lwinmm -m32

2462774さん:2010/07/21(水) 01:25:35
C++編(標準ライブラリ) 第28章 アロケータ
http://www.geocities.jp/ky_webid/cpp/library/028.html
---
>のように書きますが、この場合、独自のアロケータCMyAllocatorが確保する型はint型な訳です。つまり、int型用 のアロケータなので、各要素を表現する構造体の型とは一致するはずがありません。従って、std::listは、プログラマ がせっかく定義したアロケータを使うことがないことになります。
>これはstd::setやstd::mapのような連想コンテナ全般にも当てはまることです。これらは、ほとんどの実装では、 木構造(アルゴリズムとデータ構造編第16章参照)を使っているので、 リスト構造の場合と同様の理由で、指定したアロケータが使用できないことになります。
-----
な、なんだってー。
まあ、詳しくは実装を見てみないと分からないが、何のために
-----
// アロケータをU型にバインドする
template <class U>
struct rebind
{
typedef allocator<U> other;
};
-----
があるのかが分からない。

2463774さん:2010/07/21(水) 01:37:55
パッと見、rebind使っているから効果はあると思う。

2464774さん:2010/07/21(水) 09:38:52
g++ main.cpp -std=c++0x -O3 -lwinmm -m32

2465774さん:2010/07/21(水) 09:46:48
何故上のようなことを調べたかというと、listの中の要素に自身のiteratorを持たせて、削除も定数時間で行えるようにしたかったからです。
ただそれだけ。
iteratorについては帰ってきてから、仕様を当たる。
そういう記述はない気がする。

2466774さん:2010/07/21(水) 10:04:34
forward_list発見・・・

2467774さん:2010/07/21(水) 10:09:09
ちゃんと前に読んだことが有るはずなのに、忘れていた。
C言語で書かれたのと同じスピードで動くように簡素化されているんだよね。

2468774さん:2010/07/21(水) 10:14:29
iterator before_begin();
const_iterator before_begin() const;
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;

2469774さん:2010/07/21(水) 10:17:13
取り敢えず、forward_listは俺の需要を満たすものではない。
list最高!

2470774さん:2010/07/21(水) 17:42:55
>listにデータ操作を加えた後は、それ以前に取得したイテレータの動作は保証
>されないと思います。
>例えば、ソートや、データの追加、削除を行った場合。
-----
一番困るのが、仕様に書かれていないということだ。
ちゃんと、保証しなければならないor保証しなくても良いと書いておくべきだ。
勿論、書いてあるかすら確認していないので変なことを俺は言っているかもしれない。
上が正しいならば、走査しながらの削除が出来ないとは困ったものだ。

2471774さん:2010/07/21(水) 17:44:12
STLはそういうことはremove_ifを使ってやれと言っているのだろうか。
分からんでもないが・・・
俺が書こうとしているソースを考えると、かなり意味論的におかしい。
実行は出来るが。

2472774さん:2010/07/21(水) 17:44:41
まあ、こっちの方がメモリを食わなくてうれしいかもしれない

2473774さん:2010/07/22(木) 03:09:06
俺はなんとアホなんだ。
自分の要求を満たすlistを作ればいいじゃないか。

2474774さん:2010/07/22(木) 03:35:38
駄目だ。
仕様がデカすぎで面倒。

2475774さん:2010/07/22(木) 05:52:15
WinGDI遅すぎ。

2476774さん:2010/07/22(木) 23:46:43
何かやらかしたいなと思うのだが、やっぱり先人には敵わない。
俺はただの凡人だなあと思う限りである。

2477774さん:2010/07/23(金) 00:14:14
Greasemonkey Script : ニコニコ動画に拡張マイリストを追加するGreasemonkeyスクリプト - 棚からパルチャギ
http://castor.s26.xrea.com/products/greasemonkey/nicovideo_additional_mylist.html
-----
のSeaHorse版が全く更新されていない。
まあ、人口が少ないので仕方ないだろう。俺も最近RSSリーダーになっているし。
早くIE9出ろ。
アレで、ようやくFx2辺りに並ぶ。

2478774さん:2010/07/23(金) 01:09:23
JS+Javaで作りたくなった。
徹夜で作ってみせる!
まあ、Javaは初めてなので、上手くいかなさそう。

2479774さん:2010/07/23(金) 01:20:55
いきなり頓挫しそうだぜ!
取り敢えず明日の朝食を食うために、寝たほうがいいかなあ

2480774さん:2010/07/23(金) 01:40:52
有限不実行、これが俺。
駄目駄目だなあ・・・

2481774さん:2010/07/23(金) 01:41:15
まあ、ゆっくりやろう。
今日はまだ二十二時間あるのだ。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板