[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 06/27 01:24 / Filesize : 192 KB / Number-of Response : 847
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】STL(Standard Template Library)相談室 9



1 名前:デフォルトの名無しさん [2008/02/27(水) 02:03:30 ]
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 8
pc11.2ch.net/test/read.cgi/tech/1198435319/

過去ログ・リンク・書籍紹介は >>2 以降

2 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 02:05:01 ]
【C++】STL(Standard Template Library)相談室 7
pc11.2ch.net/test/read.cgi/tech/1185986999/
【C++】STL(Standard Template Library)相談室 6
pc11.2ch.net/test/read.cgi/tech/1160821240/
【C++】STL(Standard Template Library)相談室 5
pc8.2ch.net/test/read.cgi/tech/1143608073/
【C++】STL(Standard Template Library)相談室 ;4
pc8.2ch.net/test/read.cgi/tech/1130680264/
【C++】STL(Standard Template Library)相談室 3
pc8.2ch.net/test/read.cgi/tech/1116559700/
【C++】STL(Standard Template Library)相談室 2
pc8.2ch.net/test/read.cgi/tech/1104898734/
【C++】STL(Standard Template Library)相談室
pc5.2ch.net/test/read.cgi/tech/1095583235/

3 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 02:05:31 ]
入門ページなど

・入門
www.jah.ne.jp/~naoyuki/Writings/STL.html
・入門,一覧,使い方
www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
www.s34.co.jp/cpptechdoc/reference/stl_samples/
・TIPS集
www.nantekotta.com/stl.html
・メルマガ
www.kab-studio.biz/Programing/STLiostream/
・解説
ja.wikipedia.org/wiki/Standard_Template_Library
www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/stl/about_stl.html

マルチスレッドプログラミングの時には
www.logos.ic.i.u-tokyo.ac.jp/~yokoyama/trash/stl_thread.html

STLPort
www.sgi.com/tech/stl/
www.stlport.org/

4 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 02:05:53 ]
書籍紹介


STL標準講座―標準テンプレートライブラリを利用したC++プログラミング
www.amazon.co.jp/gp/product/4881357786/

STL―標準テンプレートライブラリによるC++プログラミング 第2版
www.amazon.co.jp/gp/product/4894714329/

標準C++:STLの基礎知識
www.amazon.co.jp/gp/product/4756138047/

標準講座C++―基礎からSTLを利用したプログラミングまで
www.amazon.co.jp/gp/product/4881357050/

STLによるコンポーネントデザイン
www.amazon.co.jp/gp/product/475613422X/

Effective STL―STLを効果的に使いこなす50の鉄則
www.amazon.co.jp/gp/product/4894714108/


5 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 02:07:07 ]
関連スレ

C++相談室 part60
pc11.2ch.net/test/read.cgi/tech/1200044614/

Boostを語れゴラァ part5
pc11.2ch.net/test/read.cgi/tech/1192662575/

C++0x 2
pc11.2ch.net/test/read.cgi/tech/1191842951/

C++0x Part2
pc11.2ch.net/test/read.cgi/tech/1191754720/

6 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 02:07:36 ]
template class< >>1 >乙

7 名前:デフォルトの名無しさん [2008/02/27(水) 09:50:04 ]
てすと

8 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 10:31:03 ]
#include ">>6"
乙< >>1 > >>1乙;

9 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:04:36 ]
C++0xでは

typedef vector<int>::const_iterator CIT;

for(CIT i = v.begin(); i != v.end(); ++i) {
//...............
}

こんなことしなくて良いなんてよぉ〜

for(auto i = v.begin(); i != v.end(); ++i) {
//...............
}

素晴らしいじゃんかよぉ〜 禿考えたのぉ〜

10 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:39:20 ]
template <typename T> typedef std::vector<T>::iterator auto;
for (auto<int> i = v.begin(); i < v.end(); ++i)

autoの癖にint宣言が必要だから駄目か
という以前に(ry



11 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:30:39 ]
for (auto i: v)
にはならないのか

12 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:34:30 ]
Dだとforeach(i; v)でいけるのを考えると、どうも見劣りがする

13 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 20:29:12 ]
>>11
今は頑張ってもBOOST_FOREACH(i, v);か



14 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:13:19 ]
禿はよく頑張ってるよ。うん。
この調子でどんどん奇怪な言語に仕上げてくれ。

15 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:20:53 ]
SchemeやりはじめてからC++が糞に見えてきた。まさにやっつけ言語。

16 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:23:48 ]
www.research.att.com/~bs/

17 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:35:09 ]
SchemeはC++で実装されてるんですよ

18 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:37:25 ]
あれ?C++0xではさらにこうなるんじゃなかたっけ?
std::vector<int> vec = { 1, 2, 3 };
for ( auto i; vec ) {
    std::cout << i << std::endl;
}

19 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:42:06 ]
まだドラフトには入ってないけど
検討されてはいたはず。

20 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 22:58:43 ]
perlから帰ってくると

for i ( 10, 15, 23, 8, 6 ) {
 cout << i << endl;
}

みたいなことを凄くやりたくなる



21 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:19:46 ]
>>17
C++コンパイラはLispで実装されてるんですよ

22 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:22:26 ]
LispはSchemeで実装されてるんですよ

23 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:27:40 ]
www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2394.html
www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2385.pdf

によれば

for ( auto i.; { 10, 15, 23, 8, 6 } ) {
  cout << i << endl;
}
はできるような気がする。

24 名前:20 mailto:sage [2008/02/28(木) 00:24:53 ]
       ,..-──- 、
     /. : : : : : : : : :: \
    /.: : : : : : : : : : : : : : ヽ
   ,!::: : : : : :,-…-…-ミ: : :', マジかよ
   {:: : : : :: : :i '⌒' '⌒'i: : :}
   {:: : : : : : |   ェェ ェェ | : :}      ∩___∩
   { : : : : : :|    ,.、  |: :;!     /  >>23   ヽ
__ヾ: : : :: :i  r‐-ニ-┐| :ノ     | ●   ●   |
    ゞ : :イ! ヽ 二゙ノイ‐′     | ( _●_)     ミ
        ` ー一'´ヽ \  ,,-''"彡 |∪| __/`''--、
  )     |@      |ヽ/     ヽノ ̄       ヽ
  |      |     ノ / ⊂)            メ  ヽ_,,,---
  |     .|@    | |_ノ  ,へ        / ヽ    ヽノ ̄
  |     |_   / /  | /  |        |  ヽ_,,-''"
__|_    \\,,-'"\__/  /     ,────''''''''''''''"""""""
    ~フ⌒ ̄ ̄  ~ヽ ヽ   ̄ ̄"""'''''''--、""''''---,,,,,,__
    /       ̄''、|ノ           )ヽ
___/       ̄ ̄)           / |___

25 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 00:42:49 ]
>>23

       --、  _____ -丶
       |;;;/::::::::::::::::::::::::::::::/ |
       // ̄,'' ̄ ̄\:::::::'''',,,丿    
      /-=・=- -=・=- _|:::::::::::::\          
     /ゝ  ▼   <:::::::::::::::<:::: ̄--_
   ---┼/   、   -─-\--<::::::::::::::::::::-_ ふーん
   --─\   ⌒   ̄ ̄ ̄ゝ::::::::::::::::::::::::::::::::::::::::-_
       \__   ゝ/::::::::::::::::::::::::::::::;;;;;;;;;;;::::::::::::\
        ,,ノ    丿:::::::::::::::::::::::::/:::::::::::::::::::::::::::::::::::|
         >    /:::::::::::::::::|::/::::::::::::::::::::::::::::::::::::::::::::|
          >.,. /::::::::::::::::::ノ;;/:::::::::::::::::::::::::::::::::::::::::::::::::|   ____________
           /:::::::::::::::::::ノ;;;;|::::::::::::::::::::::::::::::::::::::::::::::::::::|__-||||||::::||||||::::||||\
           /::::::::::::::::::/;;;;;;;|:::::::::::::::::::::::::::::::::::::::::::::::::::::|::::|||||||:::||||||:::||||||::::::
       (!!!!!!(:::::::::::::::/ ;;;;;;;;;;;;|::::::::::::::::::::::::::::::::::::::::::::::::::::/::::|||||||:::||||||:::|||||||::ノ
       (!!!!!!!!!!!!!ノ  (lllllllllllゝ:::::::::::::::::::::::::::::::::::::::/-- ̄        ̄
                    ,,,,ヽ::::::::-ゝ:::::::::::/
                   (!!!!!!!!!!!!!!!!!!!!ノ


26 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:24:33 ]
LoadFromFile/Save〜、
LoadFromStream/Save〜、
みたいな入出力は、
STLではどうなっていますか?


27 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:25:45 ]
>>26 fstream, istream, ostream とか

28 名前:26 mailto:sage [2008/02/28(木) 11:35:28 ]
さんks

メモリプールはどんな感じで実装すれば良いのでしょう?
fstreamで読みながら、メモリサイズを増やすと、劇遅な機ガスので。

29 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:38:38 ]
>>28
いきなりメモリプールって言われても何のことだかわからん。
読みながら増やすのが嫌なら読む前にファイルサイズで確保すれば
「プール」とか要らんだろ。

30 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:41:46 ]
ストリームを読む場合なんかだと、最初にサイズが分かりませんが、
効率的なプールはどうやったら作れますか?



31 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:27:52 ]
>>30
サイズが分からないという前提なら、読みながらメモリ確保が必須なのはしょうがないだろ。

「効率的な」というのが「読みながらメモリ確保しない」という意味でないのなら、説明して
もらわないとわからん。

32 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:51:08 ]
>>28
漠然とし過ぎていてなんとも。メモリプールを最適化するのに実測なし
で議論するのは簡単ではないと思う。

33 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:54:51 ]
STLはメモリプールですが?

34 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:58:18 ]
>>33
コンテナだろ?そりゃそうだ。

35 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:00:23 ]
STLを使って、
LoadFromFile/Save〜、
LoadFromStream/Save〜、
がある、
メモリプールの実装教えれ!

36 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:02:11 ]
>>35
ぶん ぶん ぶん ハチが飛ぶ

37 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:11:28 ]
>>35
ありません。さようなら。

38 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:15:09 ]
assignだけで、ファイルがメモリに展開されるの?
 ↓
#include <vector>
#include <map>
#include <string>
#include <istream>
#include <iterator>
#include <fstream>
#include <cstddef>
#include <exception>
#include <iostream>
typedef std::vector<char> memory_type;
class pocket {
 std::map<std::string, memory_type> naka;
public:
 void ireru(std::string const& filename) {
  std::ifstream file(filename.c_str());
  file.exceptions(std::ios::badbit | std::ios::failbit);
  naka[filename].assign(std::istreambuf_iterator<char>(file)
  , std::istreambuf_iterator<char>());
 }
};

int main(int argc, char* argv[]) {
 try {
  pocket pocket;
  for (int i = 1; i < argc; ++i) { pocket.ireru(argv[i]); }
  return EXIT_SUCCESS;
 }
  catch (std::exception const& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE;
 }
}

39 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:18:52 ]
やってみたらわかるんでない?

40 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:21:34 ]
>>38
範囲指定イテレータのassignだよ。vector, deque, list, stringにある。
void container_type::assign(InputIterator b, InputIterator e);



41 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:22:41 ]
istreambuf_iteratorで検索したら分かりますた。

ttp://ml.tietew.jp/cppll/cppll/thread_articles/3804

>stringのコンストラクタはiteratorを取れるんですね。
>ifstream fs(path);
>s= string((istreambuf_iterator<char>(fs)),
>istreambuf_iterator<char>());

1行でLoadは分かりましたが、逆に対になる1行でSaveするにはどうすれば良いでしょう?

42 名前:41 mailto:sage [2008/02/28(木) 13:24:42 ]
それと、stringによるLoadだとテキストファイル対象のようですが、
バイナリファイルだとどうなりますか?

43 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:39:26 ]
vector

44 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:48:55 ]
>>41
string s("unko benki");
ofstream ofs("koumon.txt");
copy(s.begin(), s.end(), ostreambuf_iterator<char>(ofs));

45 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:52:12 ]
>>44
>ostreambuf_iterator
の使い方サンks。

次バイナリファイルの場合キボン。

これが分かれば、LoadFromFile/SaveFromFileメソッドを実装して、今日は定時でさっさと帰ります。

46 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:53:56 ]
>>42
istreambuf_iteratorはバイナリ入力(sgetc, sbumpc)なんだが。

47 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:57:30 ]
>>45
ostreambuf_iteratorはバイナリ出力(sputc)なんだが。
詳しくは、ストリームバッファクラス。

48 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:58:48 ]
>>46
なるほど、
vector<char> Memだったとして、
ファイルストリームfsを作って、
のistreambuf_iteratorをfsから作って、
Memに代入すれば良いのですね?

ってイマイチ書き方が分からない。
コンパイラに相談しながら書いてみます。

イテレーターって難い。


49 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:00:01 ]
thx>>47
>ストリームバッファクラス

あ、これ未調査だった。
やっぱ、ストリームの基底クラスがあるんだね。
それが分かれば分かる筈。

50 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:03:23 ]
>>49
ストリームクラスの基底クラスではない。
継承関係にはない。
ストリームバッファクラス(basic_streambuf<>)のオブジェクトへの
ポインタを保持している。



51 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:29:38 ]
テキスト版は出来ますた。

//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());

//stringからバッファへロード
}
//---------------------------------------------------------------------------
bool Test::SaveToFile(const char *filepath)
{
string SBuf(Text());

//バッファからstringへセーブ

ofstream fs(filepath);
copy(SBuf.begin(), SBuf.end(), ostreambuf_iterator<char>(fs));
}
//---------------------------------------------------------------------------


52 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:52:45 ]
>>51
ファイルのオープンに成功したかどうかは
チェックせんの?

53 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:02:08 ]
伸びてると思ったらまた宿題の続きかよ

54 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:05:56 ]
>ファイルのオープン

//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());

if (!fs.is_open()) return false;

//stringからバッファへロード

if (fs.bad()) return false;
if (fs.fail()) return false;

return true;
}
//---------------------------------------------------------------------------


55 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:06:46 ]
あ、やっぱこう。

//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());

if (!fs.is_open()) return false;

if (fs.bad()) return false;
if (fs.fail()) return false;

//stringからバッファへロード

return true;
}
//---------------------------------------------------------------------------


56 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:10:29 ]
少しはマニュアル読め
コード読んでるこっちが恥ずかしくなるわ

57 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:10:42 ]
if(!fs)

でいいだろ

58 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:14:02 ]
ラジャ!

//---------------------------------------------------------------------------
bool Test::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath);
if (!fs) return false;

string SBuf((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());

if (fs.bad()) return false;
if (fs.fail()) return false;

//stringからバッファへロード

return true;
}
//---------------------------------------------------------------------------

59 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:30:28 ]
やっぱ、バイナリの場合、書き方分かりません。

既に、
>vector<char> Memory
ってのが存在していた場合は、
上の書き方のままだったらロードするときのメモリは別にとって、次に、Memoryにコピーしなきゃならないのでしょうか?

それだと、メモリ2倍で勿体ないような。

60 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:41:00 ]
>>59
vectorに読み込みたいのか?
ならvectorにも同様のコンストラクタがある。




61 名前:59 mailto:sage [2008/02/28(木) 15:48:05 ]
あ、そうではなくて、既に存在しているvectorにロードしたい場合は、ですが。

もしかして、
>vector::swap
でおk?

62 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:55:06 ]
>>61
assign では駄目なのか?
なんか基本があやしいふいんきだから
Accelerated C++ くらいは目を通した方がいいと思うんだが。

63 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 16:02:10 ]
>>61
Memory.assign((istreambuf_iterator<char>(fs)), istreambuf_iterator<char>());
vector<char>(Memory).swap(Memory);

64 名前:59 mailto:sage [2008/02/28(木) 16:05:38 ]
>>62
ふいんきでヴぁれました?

>>63
回答サンks。
上の1行で良いように見えますが、上下2行でセットですか?

まずは、assignぐぐってみまつ。

65 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 16:11:15 ]
この内容って関係してますか?
ttp://etwas.wolfish.org/diary/2007/02/28/2007022801/

66 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 16:58:38 ]
チャットじゃないんだから少し頭ん中整理してから投下してくれ

67 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:04:43 ]
>>59
おまえ C++Builderスレでも同じ様なこと書いてる奴だろ?

68 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:04:59 ]
バイナリの方、整理しますた。
//---------------------------------------------------------------------------
クラスヘッダー: std::vector<char> Memory;
//---------------------------------------------------------------------------
bool Bin::LoadFromFile(const char *filepath, bool bAdd)
{
ifstream fs(filepath, std::ios::in | std::ios::binary);
if (!fs) return false;

fs.seekg(0, std::ifstream::end);
Memory.resize(fs.tellg());
fs.seekg(0, std::istream::beg);
if (fs.bad()) return false;
if (fs.fail()) return false;

fs.read(&Memory[0], Memory.size());
fs.close();
return true;
}
//---------------------------------------------------------------------------
bool Bin::SaveToFile(const char *filepath)
{
ofstream fs(filepath, std::ios::out | std::ios::binary);
if (!fs) return false;

copy(Memory.begin(), Memory.end(), ostreambuf_iterator<char>(fs));
if (fs.bad()) return false;
if (fs.fail()) return false;

return true;
}
//---------------------------------------------------------------------------

69 名前:59 mailto:sage [2008/02/28(木) 17:06:08 ]
>>67
自分もそう思ったが、よくよく見ると違った。ていうか、あっちの方がラベルが高くて難しい単語が出てくるおw

70 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 17:12:44 ]
鼻血ブーーーーーーーーーーーーーーーーーーー
うんこブリブリブリーーーーーーーーーーーーー



71 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:11:16 ]
>>69
いや、それじゃねえな。 偶々std::を使ったレスを持ち出して、 話のはぐらかしか?

72 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:19:14 ]
イミフメ>>71


ttp://articles.blog79.fc2.com/blog-date-200610.html
>std::stringの大文字/小文字変換
>通常は上記の書き方で問題ありませんが、これがコンパイルエラーとなる場合があります。

についてkwskキボンorz

73 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:24:42 ]
>>72
解説文も解読できないんならおまえ向いてないよ。 工場のライン工やっとけ

74 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:30:01 ]
のびてると思ったら…
C++って学校の宿題スレなかったっけ?

75 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:31:09 ]
>int toupper(int);
>int tolower(int);
> std::transform(str.begin(),str.end(),str.begin(),toupper);
>: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unknown type>)'

これでもエラー出るんですよねorz

76 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:34:38 ]
ゴメンなさい、
> (int (*)(int))std::toupper
に直してませんですたorz

77 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:57:33 ]
マクロの場合があるからと違うんか

78 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 22:13:46 ]
>>77
違う。localeを引数に取る多重定義があって、それと曖昧と言われてしまうため。

79 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 23:29:51 ]
関数オブジェクトを使うべき

80 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 05:46:31 ]
typedef std::map<char, void*> MyMAP //void* にはMyMAPのポインタが入る

このようにmapに自分と同じ型を含めたい場合は、どう書くのがスタンダードでしょうか?
今はnewで確保して入れて、(MyMAP*)にキャストして使用&deleteしてるんですが。



81 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 09:43:26 ]
>>80
typedef だと無理っぽいねぇ。 class で囲ってやるか、意味的に奇怪だけど継承するとか。
struct MyMap : std::map<char, MyMap*> {};

82 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:15:18 ]
今、軽く衝撃を受けたわ

83 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:32:04 ]
>>81
>struct MyMap : std::map<char, MyMap*> {};
そんな事ができるとは思いもしなかった

84 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:42:27 ]
>>83
できない理由が無ければできるもんだよ。

85 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:08:07 ]
例えば、vectorってベクターって呼んで、vectorクラスなんて呼ばないけど、
STLってできあがるものってクラスなんだね。

86 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:14:36 ]
>>85
いいえ。コンテナだけがSTLではありません。

87 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:17:57 ]
え”?

STL = コンテナ ∩ イテレーター ∩ ?

88 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:23:47 ]
つ[<algorithm>, <numeric>, ...]

89 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:25:34 ]
>[<algorithm>, <numeric>, ...]

こういうのって何て呼ぶんだ?
インライン関数群?

90 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:45:02 ]
なぜ何でもカテゴライズしたがるんだか



91 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:51:26 ]
>>89
インクルードファイルalgorithmやnumericで定義されている関数

>>90
日本人だからでしょ

92 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:09:35 ]
テンプレートだけに型に(ry

93 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:52:10 ]
boost::type_traits早く標準化汁

94 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 15:59:45 ]
標準アルゴリズムって言葉使わないか?

95 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 17:22:11 ]
いやまて朝鮮人かもしれんぞ
ことによると中国人かも

96 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 17:56:00 ]
>>90
神の教えだからだろ

97 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 18:34:41 ]
std::wstringに入ってるファイル名があるのですが、
ここから拡張子だけを抽出したい場合、定番の方法などあるのでしょうか?

98 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 18:50:10 ]
rfind と substr でいけるんじゃね?
まあ c_str と _splitpath() のほうが面倒が少ないと思うけど。

99 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 13:02:13 ]
Win32APIが使えるなら一発

100 名前:デフォルトの名無しさん [2008/03/03(月) 16:27:08 ]
>>97
std::stringにファイル名が入ってるなら
そのファイル名が入ってるstd::string型のオブジェクト名
がfilenameという名前とすると
char *fname = filename.c_str();
てな感じでchar *型で受け取り
#include <cstring>をインクルードしておき
char *piliod = strrchr(fname,'.');
で拡張子の手前のピリオド位置を取得し
piliod++;ってすれば拡張子名だけchar *型で取得できる
これらの操作をwchar_t用の関数に変更すれば
wchar_t *型で拡張子名を取得できる
まぁ、STL板だしstd::wstringを操作するとしたなら
素直にクラスのfind_last_of使って
sizetype pos = filename.find_last_of(L'.')てな感じで
けつからピリオドの位置見つけてpos++;して
std::wstring fextenshion =filename.substr(pos)とすれば
拡張子だけ手に入る




101 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 18:54:54 ]
が、特殊ケースを想定するとそれだけでは済まないので、
ちまちま書くよりc_strでランタイムやAPIの既存のルーチンに任せるのが定番。

102 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 18:57:59 ]
だよなぁ。hoge\2007.11.10\bar とか。

103 名前:デフォルトの名無しさん [2008/03/06(木) 14:54:51 ]
>std::vector<char> resultBuf;
から、
>std::string SBuf;
にデータを移すにはどう記述したら良いですか?

SBuf = resultBuf;

とするとコンパイルエラーです。

インテリセンスの無い環境でやっててつらいです。

104 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:12:55 ]
>>100
char *fname = filename.c_str();
これは、不味いんじゃないのか?


105 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:15:26 ]
>>103
SBuf = &resultBuf[0];

106 名前:103 mailto:sage [2008/03/06(木) 15:20:33 ]
>>105
有難うございます。コンパイル通りました。


ついでですが、resutlBufにNULLが入ってる場合、どう書けば良いですか?
今回不要なんですが。
memcpy使うのもC言語っぽいしぃ。

107 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:21:39 ]
std::string SBuf(resultBuf.begin(), resultBuf.end());
または、
SBuf.assign(resultBuf.begin(), resultBuf.end());
resultBufがnull終端なら>>105でもいい

108 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:24:40 ]
>>105
stringの内部バッファの連続性はまだ保証されてない気がしたが。

109 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:27:58 ]
>>108
それは関係ないだろ
string s = "foo";
とかやるのと一緒

110 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:31:41 ]
>>108
resultBufは、char型のvector
vectorはバッファの連続性を保証されているから無問題
問題があるとすれば、>>107の指摘の様にnull終端では無い場合



111 名前:103 mailto:sage [2008/03/06(木) 15:42:13 ]
NULL入りの場合、無しの場合、両方分かりました。
ありがとうございましたorz

112 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 15:52:55 ]
>>108
それよりも、>>104の指摘している
>>100
char *fname = filename.c_str();
の方がやばいんじゃない?
*fnameの代入が終了したら、c_str()の戻したポインタの有効期限が切れているから

char *piliod = strrchr(fname,'.');
の処理をするときには、何が起こるのか判らない状態になっていると思うんだけど


113 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:06:11 ]
>>112
filename.c_str()で返るポインタは、filenameの非constメンバ関数が呼ばれるまで有効

114 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:27:45 ]
>>105だとresultBufが空のときにまずいような気がする

115 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:31:54 ]
null終端なら空ってことはありえない

116 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:43:22 ]
>>113
お前そんなプログラム書いてるのか。お前には仕事を任せられんな。

117 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:44:44 ]
>>113
まじ?
ゴミになったのに、ゴミになったって気が付いてないとかそう言う問題の気がするが...

lstrcpy(buf, str.c_str());
これは怖くないが

char *word = str.c_str();
lstrcpy(buf, word);
これは、いつ見ても、ヤバイ香りがするんだ

関数の返すポインタには何度も煮え湯を飲まされたし...orz

118 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:52:12 ]
>>116
>>117

>>113 is right.

About c_str()

The return value is valid only as long as the string exists, and as long as only
constant functions are called for it.



119 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:53:25 ]
>>118
言い訳はいいからお前には仕事はやらん。

120 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:54:49 ]
>>116
お前のレスだけ明後日の方向むいててワラタ



121 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 16:56:16 ]
>>116
「そんなプログラム」ってどんなプログラム?
>>113はプログラムの書き方なんか一言も触れてないよね。
c_str()の戻り値の寿命についての情報を書いてるだけ。

「そんなプログラム」ってどんなプログラム?
それは113のどこに書いてあるの? 教えて。

122 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:05:37 ]
煽ってるようだけどその手には乗らないよ。
びびりまくりでワロタw

123 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:08:15 ]
ちゃんと寿命を理解しないで使う方が怖いよ

124 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:09:05 ]
仕様をちゃんと知らずに見よう見まねでライブラリを使う人ってのは結構いるだろうけど、
見よう見まねや雑談で得た俺仕様を根拠にして、正しい仕様に基づく使い方を攻撃するのは
みっともないと思う。

125 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:10:03 ]
うっかり誰かがstring書き換えるコードを途中に入れてしまったら、
なんて心配をするようなら、116の言うことだって分からなくもない。

126 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:11:55 ]
どうでもいいが、
>lstrcpy(buf, str.c_str());
これと
>char *word = str.c_str();
>lstrcpy(buf, word);
これで振る舞いが異るようにc_strを実装する方法は存在しないだろ

127 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:11:59 ]
>>117
>関数の返すポインタには何度も煮え湯を飲まされたし...orz

仕様を確認せずに「香り」でコード書くから何度もそういうミスを繰り返すのかもね

128 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:15:34 ]
仕様仕様言ってて仕事がもらえない方が悲惨だと思わない?
会社にはその会社の流儀って物があってね。

129 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:17:33 ]
>>126
>lstrcpy(buf, str.c_str());
は、lstrcpyの処理が終わるまで、誰もstrを変更しないことが保証されている。

>char *word = str.c_str();
>lstrcpy(buf, word);
は、どこかの禿が
>char *word = str.c_str();
>f(str);
>lstrcpy(buf, word);
と変更しない保証は何処にもないし、f(str)がstrを変更しない保証も無い

130 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:18:24 ]
んでその流儀に従って何度も煮え湯を飲まされるわけ?
なんかバカらしいぞそれ。

仕様をよく確認しなかったが、流儀に従って安全そうに書いたので
救われたって話ならわかるけど。




131 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:19:54 ]
まったく、ひどい論点のすり替えだぜ。

132 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:21:09 ]
>>130
お前ニートか無職だろ。
協調性がゼロみたいだもん。

133 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:22:30 ]
>>129
そんな話はしてねーよ
前者と後者で振る舞いが異なるはずがないと言ってるだけ

134 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:24:38 ]
いや個々の会社が>>100みたいなのを禁止するのは勝手だけども、
>>100みたいな使い方が仕様に照らして問題ないという事実は変わらないだろ

135 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:25:44 ]
>>132
ちゃんと働いてるし、給料も沢山もらってるから心配スンナ
世の中はそんな妙な流儀を押し付けられるような職場ばかりじゃないってこと

136 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:35:32 ]
未経験高卒ですがC++で仕事したいです

137 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:44:28 ]
>>133
それはわかる。
ただ、俺から見れば117がやばい香りを感じるのは
129のような可能性があるからというのが最大の理由ではないかと思う。

138 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:50:14 ]
>>137
全く持って同意

同一データに、2通りのアクセス方法があると、間違いを起こす元になると思う


139 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:54:50 ]
>>137
なるほど、そういう見方もあるか
俺は、>>117がC++の実行モデルをあやふやにしか理解してないとか、
文を跨ぐと一時オブジェクトの寿命が切れるのと混同してるとか、そんなのを想像してた
それに、「ゴミになったのに」云々言ってるから、そのままのコードでもポインタが無効になるのを危惧しているように読める

140 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:57:27 ]
イテレータだって挿入削除で無効になるんだから、
特別神経質になるほどのことでもないと思う。



141 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 17:57:30 ]
>>138
そういう意味では、イテレータも基のstringがconstでない場合は、
おちおち使っていられないよな。

例えばだけど、本質的にはこの2つに違いはないと思った。
(もちろん文字列中に\0はないとして)
char const* p = std::strchr(s.c_str(), 'a');
std::string::const_iterator it = s.find('a');

142 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:05:16 ]
赤福の賞味期限偽装に近い問題やね

賞味期限はいつか本当に切れるだろうが、それは今じゃない...

143 名前:108 mailto:sage [2008/03/06(木) 18:06:14 ]
resultBufがstringだと勘違いしてた

144 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:19:31 ]
今更だなw
だが正直でよろしい

145 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 18:49:07 ]
>>116はどう見ても釣り。


146 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 19:24:41 ]
>>116は真性の馬鹿者
仕様を初めて知って、これからはいかにも前から知ってましたよって顔で
他の人にこの問題を説明するだろう。

147 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 19:25:38 ]
>>146
このスレではどうでもいいことだけどな。

148 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 20:54:34 ]
ところでc_str()をchar*に入れてるのは誰も突っ込まないんだろうか。

149 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:03:52 ]
確かに、そういう人には仕事任せたくないなw

150 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:07:44 ]
それ以前にコンパイルエラーになると思うが



151 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:11:41 ]
std:stringのバッファの連続性が保証されることは、&str[0]とstr.c_str()のアドレス同一性を保証しますか?

152 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:15:31 ]
保証しない。
c.str を呼んだ場合、メモリの最確保が行われる可能性がある。

153 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:17:32 ]
なるほど。str.data()はどうでしょうか。

154 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:19:05 ]
残念ながら data も同じ。

155 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:22:21 ]
しかしなんだな。
今の規格ではバッファの連続性を保証していなくて、
次の規格ではバッファの連続性を保証する予定ではあるのだが、
連続性を保証したら data で参照、ポインタ、イテレータが失効する可能性は
もう無くなるとしてもいいような気がするんだけど、
最新のドラフトではそうなってないんだよな。
ミスなのか、それとも何か深い理由でもあるのか・・・。

156 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:25:17 ]
>>155
正直プライオリティ低いんだろ
どうでもいいわと思ってる委員が多いと予想

157 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:26:44 ]
しかし、そろそろそういう細かいところも詰めていかないと、
0x の x は16進数ってのもあながち冗談では済まなく・・・。

158 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:28:14 ]
いざとなったら得意のundefined behaviorでいいだろ。

159 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 21:51:10 ]
やたらスレが伸びてると思ったら・・・
もうここの連中には仕事任せられんな
今後は>>170にすべてを託すこととする
なお異論は受け付けない

160 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 04:52:01 ]
それは無意味にkskしろってことかい



161 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 09:34:55 ]
string::swap について教えて下さい。

>void func(string &sArg)
> string sBuf = "AAAAAA";
> sBuf.swap(sArg);

のときって、sBufの内容がsArgに移し変えられるっていうのがswapの機能だと思います。

この場合、実装に依存するんだと思いますが、
メモリのエリアがガバっとコピーされるのではなくてクラスの参照を交換してくれるんでしょうか?
性能的に優れてるものだったら、使いまくりたいですし。

一度も使ったこと無いので、swap後にちゃんとメモリ保持しててくれるんだろうか、
落とし穴は無いだろーななんてガクブルしてます。

162 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 09:55:42 ]
>>161
stringだったら、内部で保持しているであろう
文字列へのポインタや長さなどといった変数だけが交換されるとみな仮定している。

一般的に、swapは例外を投げないとされており、
しかも、std::stringのswapはO(1)と規格で定められている。
だから、文字列の中身まで交換する実装はありえない。

163 名前:161 mailto:sage [2008/03/07(金) 10:29:50 ]
サンクス。

>一般的に、swapは例外を投げないとされており、

へぇー、勉強になりました。

>しかも、std::stringのswapはO(1)と規格で定められている。

勉強になりましたが、O(1)って何だ?_?

>だから、文字列の中身まで交換する実装はありえない。

あ、そうなんですか?
例外を発生できないとなると、参照を交換する以外に実装無いと思うんですが。
だって、交換じゃなくてコピーならば、メモリを確保しないといけないし、そうなるとエラーが発生する可能性があるような。
って素人なのに生意気逝ってすみません。

164 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 10:37:30 ]
O(1)というのは、例え文字列が長くてもswapが一定時間で終わらなければならないってこと。
文字列をコピーするなら、文字列が長くなればそれだけコピーに時間が掛かるから、この制限を満たせない。
詳しくは「計算量」でググれ。

>例外を発生できないとなると、参照を交換する以外に実装無いと思うんですが。
まさに>>162はそう言ってるんだと思うよ。
中身をコピーして交換するんじゃなくて参照(具体的にはポインタ)を交換する。

165 名前:161 mailto:sage [2008/03/07(金) 10:40:31 ]
ラジャ!

>文字列の中身まで交換する実装はありえない。

つまり、中身をコピーする実装はありえない、って文章ですね。
で、そう言い切れる理由はO(1)で時間制限してて、”ま、参照を交換する実装にしる!”、っていわば指令が出てるわけですね。

166 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 10:58:42 ]
>>165
deep copyをするとno throwの保障ができなくなる。

167 名前:161 mailto:sage [2008/03/07(金) 11:00:02 ]
すみません、教えてクンですみませんが、最後に記述を教えて下さいorz

swapを使いまくりたくなりました。
vector<char>とstringの間で、swapする記述はありますでしょか?

vectorメモリは連続しているので、vector同士だとswapできるんじゃないかと思ったのですが。
直にメモリアクセス?イテレータンを無視し過ぎるのも良くないとは思わないでも無いですが。

168 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:07:45 ]
>vector<char>とstringの間で、swapする記述はありますでしょか?
ない。実装上も、例えばstringがnull終端の分だけ余計に内部バッファを持っているなら無理。

>vectorメモリは連続しているので、vector同士だとswapできるんじゃないかと思ったのですが。
vector同士ならできる。

169 名前:161 mailto:sage [2008/03/07(金) 11:09:58 ]
>ない。実装上も、例えばstringがnull終端の分だけ余計に内部バッファを持っているなら無理。

なるほど。納得。下手にやるとはまりますね。

>vector同士ならできる。

vectorの異なる構造体同士でもできますか?
記述例超キボンw

170 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:19:32 ]
テンプレートパラメータが違うとダメだろう



171 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:28:20 ]
記述例もなにも、vとv1が同じ型のvectorなら、
v.swap(v1);
で交換できる。vectorに限らずあらゆるコンテナで。

172 名前:161 mailto:sage [2008/03/07(金) 11:36:47 ]
全部分かりました。有難うございましたorz


つまり、コンテナが違うとswapはキャストやらなんやらやヴぁい記述になるわけですね(はまるからやらないけど)

173 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:11:25 ]
質問です。

クラスメソッドの引数で、

>method(string s1) { method(s1.c_str()) }
>method(const char *s1);

みたいな感じで、オーバーロードで「string」も「char *」も両方受け入れるようにしてるんですが、
どちらか片方だけ定義、ということにできますでしょうか?

174 名前:173 mailto:sage [2008/03/07(金) 13:15:17 ]
2つ要るとしたら、stringベースとchar*ベースと効率が良いのはどちらでしょう?
まぁ、大差無いですか?

175 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:20:59 ]
>>173
stringだけ書いとけばconst char*からstringを暗黙に構築してくれると思うが、効率は良くないかも

176 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:37:12 ]
>>173
片方がconst char * なんだから、string const & の方がいいんでないかい?
で、どっちみちstringを受ける方もconst char * 版を呼び出すなら要らないわけで。

177 名前:173 mailto:sage [2008/03/07(金) 13:37:33 ]
何だ、そうでしたか。無駄に2つ作ってしまったorz

178 名前:173 mailto:sage [2008/03/07(金) 13:42:12 ]
頭が混乱してましたが、

>stringだけ書いとけば
の場合は、引数が入力である場合は、おk、

>片方がconst char * なんだから、string const & の方がいいんでないかい?
これ(つまり、& )を選択した場合は、2つ書かないといけないんですよね?

コンパイラで試せば良いのですが、皆さん普通はどうされてるのか知りたくて。

179 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:44:52 ]
>>178
わけがわからん。何がしたいのか書きなおしてくれ。

180 名前:173 mailto:sage [2008/03/07(金) 13:48:53 ]
ごめんなさい、テストプログラム書いたら違っていました。

つまり、
>stringだけ書いとけば
でおk。

>string const & の方がいいんでないかい?
でおk。

但し、char *を渡すと、W8030 Temporary used for parameter のウォーニングが出ると。



181 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:52:35 ]
話を読む限りstringやconst char*である必要性を感じないし、
俺だったら初めと終わりのイテレータを引数に取るようにする。
stringでもconst char*でもないやつもかかってこい。

182 名前:173 mailto:sage [2008/03/07(金) 13:53:05 ]
あ、「「string &」だとウォーニングだったのが、「string const &」だとウォーニング消えました。

つまりやりたかった、
>string と char *の一本化、
および、
>参照渡しでメモリ節約&コンパイルウォーニング無し
の全て解決しました。orz

183 名前:173 mailto:sage [2008/03/07(金) 13:54:45 ]
>俺だったら初めと終わりのイテレータを引数に取るようにする。

はつみみです。

これ知っとくと大分楽できそうですね。何が良いのか調べてみます。
(参考サイトでも何でも教えて頂ければ参照します。レスで教えてというのも嫌われそうなので)

184 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:58:47 ]
string const &が要求されてるところにconst char *を渡そうとしたら、stringの一時オブジェクトが作られて、
文字列の内容がコピーされるから、メモリの節約にはなってない

185 名前:173 mailto:sage [2008/03/07(金) 14:20:17 ]
>>184
あっ、そーですか。
じゃぁ、今まで作った基礎クラスはそのままに2つのままにしておこうかなぁ。。。
悩む。

186 名前:173 mailto:sage [2008/03/07(金) 14:58:05 ]
今、上記内容に沿って、”string const &型”に全面書き換え中ですが、
以外に頭が固いのが、stream系ですね。
っていうか、ifstreamとか引数にstring受け入れないっぽい。

187 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:26:37 ]
>>186
コードを書く前に、もう少しきちんと勉強したほうがいいと思います。


188 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:40:31 ]
class StringArg
{
const char* p_;
public:
StringArg(const string& str) : p_(str.c_str()) {}
StringArg(const char* str) : p_(str) {}
const char* get_arg() const { return p_; }
};

method(const StringArg& arg);

189 名前:172 mailto:sage [2008/03/07(金) 16:49:34 ]
>>188
はじめそれに近い形で書いてたんですが(違いはstring側はconstにしてなかったとこだけ)、
メソッド宣言2行になると、以外にクラス部品作るのがしんどくて。
効率悪くても1つにしたいな、と思いました。

で結局、
>StringArg(const string& str)
の方だけ活かして、
巨大なバッファで、かつ、char *の可能性がある場合のみは、188 の通り、
2つ宣言しようかと思っています。

190 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:50:09 ]

172じゃなくて、173でした。



191 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:58:43 ]
>>189
多分お前は>>188を誤読してる
const char *をとるメソッドもconst string &をとるメソッドも用意せずに、
const StringArg &をとるメソッドを用意しろってことだろ

192 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 09:00:47 ]
void Method(const char*); のみ用意して、
std::stringを渡したい場合は↓じゃあかんのか

std::string s;
Method(s.c_str());

193 名前:デフォルトの名無しさん [2008/03/08(土) 20:47:51 ]
#include <set>
using namespace std;

int main()
{
set<int> s;
s.insert(1);
s.insert(4);
(*s.begin()) = 5;
return 0;
}
上のプログラムは違法ですよね?
ウチのコンパイラは文句を言わないんだけどおかしいですよね?


194 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:53:45 ]
>>193
とりあえずg++だとエラーになった

195 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:59:06 ]
ふぁっきんBCC

196 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:03:38 ]
>>193
C++2003 に準拠しているならそれでも規格の範囲内。
変更できないことが明記されるのは次の C++0x から。
www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103

コンパイル通るからといっても、まずいことがわかってるなら
やらないでおいたほうがいいね。

197 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:04:28 ]
>>193
Effective STL 第22項をどうぞ。

198 名前:デフォルトの名無しさん [2008/03/08(土) 21:12:44 ]
>>196
サンクス。STLってたくさん欠陥があるんですね。

>>197
サンクス。今度立ち読みします。

199 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 08:45:25 ]
stringにバイナリ書き込みで、
resizeした後、・・・1
c_str()でポインタ取って、・・・2
memcpy・・・3
してます。

2ってSTL的には読み込み専用ポインタであり間違ったコードなんですが、
動作してるのでほっとこうか、正しく書こうか迷ってます。
どうしたら良いでしょう?

200 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 08:47:18 ]
>>199
間違ったコードを正しく書くのに、何を迷うの?



201 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 08:50:50 ]
>>199
必要な知識は全部持ってるみたいだが、何を訊きたいんだ?
未定義動作に依存するという欠点よりもそのコードが持つ利点が大きいと考えるなら
それを使い続ければいいし、そうでないなら書き換えればいい

202 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 08:50:55 ]
いろいろ。

じゃ、直しておきまつ。

203 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 20:18:13 ]
コンストラクタやassignとかappendがあるもんな。
イテレータにstd::copyでもいけるし。

204 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 09:05:07 ]
>イテレータにstd::copy

イテレータンって参照するだけじゃないんだ。
イテレータンがメソッド持ってるって考え方がイマイチわかんないんだおね。

205 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 15:29:40 ]
いや、イテレータを引数に取れる関数だろ

206 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 19:51:25 ]
イテレータは何かを反復するもの。「何か」は参照かもしれないし、操作かもしれない。

207 名前:デフォルトの名無しさん [2008/03/11(火) 20:59:59 ]
ifstreamで半角空白を含むファイル名や、日本語を含むパスで
ifstream ifile(フルパス名);で失敗してしまうのですが、これは仕様なのでしょうか?
仕様なのでしたら回避策はあるのでしょうか?

Visual Studio 2005SP1を使用しています。
よろしくおねがいします。

208 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:05:45 ]
問題が再現する最小限のコードを貼れ。まずはそれからだ。

209 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:05:59 ]
ロケールの設定とか?

210 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:29:37 ]
コンパイルはVisualStudio2005 Command Promptで行いました。


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

using namespace std;


int main(int argc, char **argv)
{
ifstream ifile("新規テキスト ドキュメント.txt");
if(ifile) {
MessageBox(NULL, "success", "info", MB_OK);
ifile.close();
} else {
MessageBox(NULL, "failed", "info", MB_OK);
}
return 0;
}

結果はfailedとでます。



211 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:31:17 ]
間違えました。
フルパス名をコピペして、\を一つ減らしてエクスプローラーに貼り付けると正常に開けます。

ifstream ifile("d:\\新規テキスト ドキュメント.txt");


212 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:32:25 ]
まさか、そのファイルがカレントディレクトリに置いてないとか言わないよな?
つーか、このスレより環境依存OKのスレかWindows関連のスレの方がいい希ガス。

213 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 21:42:30 ]
ありがとうございます。
環境依存スレに行ってみます。

214 名前:デフォルトの名無しさん [2008/03/12(水) 03:34:34 ]
vectorに要素をpush_backするとき、全ての要素がこっそりと引越し、
要素を指していたポインタが無効になり、ひどい目にあうことが
あるということを知りました。

そこで質問なのですが、引越し時の要素のコピーは
コピーコンストラクタを使って行われるのでしょうか?
それとも単純にmemcpyなどで行われるのでしょうか?

215 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 04:23:23 ]
>>214
コピーコンストラクタじゃなきゃヤバイでしょ。
あくまで例だけど、int型のメンバxと、そのアドレスを持つint*型のメンバpxがあって、
pxの値をmemcpyなんかした日にはえらいこっちゃ。

216 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 07:50:53 ]
>>214
もすこし具体的にどうぞ。

>>215
あんたも何を言いたいんだか。

217 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 07:51:34 ]
コピーコンストラクタでpxをdeep copyしてなければ同じようにえらいこっちゃ。だけどね。

218 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 07:53:22 ]
>>217
それは別問題

219 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 07:56:14 ]
>>214
再割り当て時にはコピーコンストラクタが使われるよ。

220 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 07:57:26 ]
>>216
俺は第三者だけど、>>214が何を訊きたいかは分かるし、>>215の回答も理解できるよ。
>>215は当を得た回答だと思う。



221 名前:217 mailto:sage [2008/03/12(水) 08:01:58 ]
deep copy するわけじゃないのか。215が言いたいのは。
コピーコンストラクタでpx=&xが必要ってことだな。多分。

222 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 08:06:43 ]
STLはコピーを前提に作られている。そういうもの。

223 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 08:07:42 ]
>>214
要素は引っ越しません。

224 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 08:46:07 ]
>>221
コピーコンストラクタという言葉を使っているところからして、
ユーザー定義型がvectorにどう扱われるかを訊きたがってるんだろうな、と判断した上で、
「コピーコンストラクタを用いなければ"正しく"コピーできない型があり得るのに、
vectorが内部で勝手にmemcpyによるコピーで満足しちゃうなんてことは無いよ」
って回答した次第。

225 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 08:49:23 ]
>>223
嘘をつくな

226 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 08:50:39 ]
>>223
規格に"引っ越し"という言葉は書いてないという揚げ足をとってるのか?
それとも単にC++を知らないだけ?

227 名前:217 mailto:sage [2008/03/12(水) 09:01:52 ]
I got it.

関係ないけどクラスをmemcpy、memcpyするソースをよく見かける。怖くて仕方ない。

228 名前:217 mailto:sage [2008/03/12(水) 09:02:25 ]
memset、memcpyだった。

229 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 09:03:13 ]
怖いじゃなくて、memsetだとプログラム落ちるだろ、jk

230 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 09:05:39 ]
そういうのはCのノリが抜け切れてない年寄りが多いの?



231 名前:217 mailto:sage [2008/03/12(水) 09:15:12 ]
>>229
落ちるとは限らないよ。仮想関数がないクラスではうまくいく。(memsetでセットする値が適切なら)

仮想関数があるクラスでmemset(this,0,sizeof(this))とかやると
仮想関数ポインタが0になるので、
ポリモーフィズム使用時にNULLポインタアクセスで落ちた。

だから抽象クラスにしたいときには、memsetしてないか全部チェックせなあかんかった。

>>230
そうだね。特に組込系が多いね。クラスを構造体の延長として使ってる。

232 名前:217 mailto:sage [2008/03/12(水) 09:22:43 ]
tp://sunlight.cocolog-nifty.com/sunlight/2006/11/class_56c5.html

こういう変なことする人もいる。class S が 仮想関数を持つクラスをメンバ変数に持ってたら
ダメじゃんって突っ込みたい。

スレ違いでゴメン!

233 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 09:28:30 ]
突っ込みたいなら突っ込んであげればいいのに

234 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 10:05:25 ]
>>232
君がインストラクタになってあげなさい

235 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 12:47:55 ]
引っ越しって言えば、moveだろ。
copyを引っ越しと言うのは無理があり過ぎる。

236 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 12:49:21 ]
>>235
引越しは後片付けしてから出て行くよ。

237 名前:217 mailto:sage [2008/03/12(水) 15:43:34 ]
自分は暗黙のインストラクタでいいのでw

238 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 21:05:27 ]
>>235
「copyを引っ越しと言」ってるようには見えないよ。「引越し時の要素のコピー」って書いてある。

コンピュータデータのmoveは、実際には「copyする」ことと「元を削除する」ことで成り立っているわけで、
つまり「move(ここではvectorの要素の再配置のこと)の手段としてのcopy」の表現だろう。

239 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 21:28:37 ]
コピコンでは普通は deep copy する。
そういうもの。

240 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:56:24 ]
参照カウント付きハンドルの場合はそうじゃないけど。
(boost::shared_ptr etc)



241 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:00:16 ]
それは特殊例

242 名前:デフォルトの名無しさん [2008/03/14(金) 00:11:29 ]
インストラクタwww

243 名前:214 [2008/03/14(金) 01:02:08 ]
レス遅れてすみません。解答してくださったみなさん、
ありがとうございます。

でも、*ほとんどの* ケースでは、単純なmemcpyで済みそうなのに、
いつでもコピーコンストラクタが使われるという仕様に疑問を感じます。

コピーコンストラクタが使われるとなると、コピー元のオブジェクトに
対してデストラクタを呼び出す必要があります。これは、*ほとんどの*
ケースでは全く馬鹿馬鹿しい無駄です。

それならreserve使え、とおっしゃるかもしれませんが、どれだけの
領域をreserveしておけばいいのか、前もって計算できないことも
よくあります。

引越し時のコピーはmemcpyで行われるべきではないでしょうか?
>>215さんが出した例のような場合、ユーザーはreserveを使います。
どうでしょう? だめ?

244 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 01:08:07 ]
allocatorを指定するとか。

245 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 01:26:34 ]
>>243
そう、毎度コピーするのは無駄と誰もが思ったから、
今度の規格改定でムーブセマンティクスというものが導入されようとしている。

246 名前:オガちゃん萌え ◆tyvkWCNtzY mailto:sage [2008/03/14(金) 01:27:09 ]
インフラはmemsetやらをやたら使うよ
アーキテクチャ依存すんだからOOPは役に立たん
ドメインでアーキテクチャ依存せんようにするにはやむえない
…が、インフラのC型記述は拡張子.cにして欲しい
イヴァーヤコブソンはそんなユースケース駆動モデルを奨めている
STLですらQACでNGになられたんじゃ参るストーン

247 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 01:47:52 ]
>>245
彼が不満に思っている状況の大半では,
move semantics は何の改善ももたらさないのでは?

248 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 01:53:02 ]
そうか?移動なら、コピーに比べ格段に低コストだし、
前のオブジェクトのデストラクタは実質やることなくなる。
こういう問題だと思っていた。214が納得するかどうかは別としてだけど。

249 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 02:09:19 ]
>>248
memcpy によってコピーできるオブジェクトというのは,
(C++0x において条件が緩和される) POD 型のオブジェクトに
およそ相当すると思いますけれど,これらのオブジェクトに対しては
コピーの操作と (move semantics でいうところの) move の操作は
同じ操作になると考えられるので「move semantics によって改善される」というのは
まずいのではないかな,と.

デストラクタに関しても, move を使っても copy を使っても
「実質やることがない」のはなんら変わりはないと思います.

250 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 10:11:23 ]
>>249
ああ、たしかにPODだとそうだね。

言葉足らずですまん。俺は非POD型を入れることことを考えていた。
というのも243でデストラクタを呼び出さなければならないと言っているから、
214=243は非POD型を念頭に置いているのだと思ったため。



251 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:04:02 ]
>>243
手元のVC8ではvector<char>とかvector<int>ならmemmoveを使ってくれたよ。
アラインメントを考慮してrep movsdで転送。

struct Foo{int a; int b;}; vector<Foo>だと単純にループ1まわりにつき
8byte転送するようなコードになってた。

PODを判定できれば両方memmoveに出来るんじゃないかな。


252 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 12:23:37 ]
わかってない子が来た

253 名前:251 mailto:sage [2008/03/14(金) 13:03:30 ]
ん、俺のこと?
俺はただ、>>243がpush_backでのバッファ拡張時にmemcpyやmemmoveのような
効率的なコピーが使われないと思いこんでいるようだったから、わかりやすい
反例を示しただけだよ。

>>243
> *ほとんどの* ケースでは、単純なmemcpyで済みそうなのに、

それで済むケースは実際にそうなる場合があるよ、と。


254 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 13:22:12 ]
>>232のアホ顔軍曹に習ってくる様にw

255 名前:251 mailto:sage [2008/03/14(金) 13:40:35 ]
ん? 仮想関数がらみとか、コピーコンストラクタでpxをdeep copyしなきゃ
ならないケースの話?
そういうクラスはPODとは呼ばないけど。


256 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 14:09:38 ]
>>251
ちょうどVC8には、__is_podがある。
ただ、手元のVC9 EEのincludeディレクトリをgrepしたが、
使っていないみたいだったorz。

257 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 19:03:11 ]
かなり初歩的な質問になるんですけど、std::setがどうやっても
当環境ではエラーを起こすのですが、原因わかりますでしょうか
#include <set>
#include <iostream>
int main(){
using namespace std;
set<int> nums; // 空のset
return 0;
}
この文を実行した場合、実行時に
Run-Time Check Failure #2 - Stack around the variable '_Lk' was corrupted.
と表示され,xtreeのソースが表示されます。
環境:WinXP Pro SP3
Visual Sturio 2008

258 名前:257 mailto:sage [2008/03/14(金) 19:12:24 ]
すみません、早速自己解決しました。
単純にPlattformSDKのcrtにあるxtreeが読まれていたからでした
お騒がせしました。
...OSまで再セットアップしたのにorz

259 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:06:21 ]
アルゴリズムに渡す、ちょっとした関数オブジェクトのクラスにどんな名前つけてる?

260 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:16:40 ]
func



261 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:18:10 ]
lambda

262 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 20:22:36 ]
fuck

263 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:15:57 ]
>>259
クラスの役割にかかわらず名前がつけられるなんて思わないでください。

264 名前:オガちゃん萌え ◆tyvkWCNtzY mailto:sage [2008/03/15(土) 17:21:41 ]
>>259
クラス名決める前に設計段階で静的モデルからクラス図作るからその段階で関数オブジェクトだろうがクラスだろうがメソッドだろうが役割に適した名前になるんじゃないの?
設計改善してコードリファクタリングの過程でまた適した名前にすると思うんだが?
STLとは関係ないし

使い捨てツール作るなら、名前なんかテキトー
動けばよろし

265 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 17:37:28 ]
ちょっとした関数オブジェクトの事だろ
他言語なら匿名メソッドとかラムダですませちゃうような奴

そんなん設計段階で無い事の方が多い

266 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:04:14 ]
はーやく来い来いC++0x

267 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 22:12:04 ]
>>259

by

268 名前:デフォルトの名無しさん [2008/03/18(火) 01:34:41 ]
先日放送されたクローズアップ現代(NHKの番組)によると、
日本のプログラマ人口は20万人だそうです(かなり不足して
いるらしい)。この20万人の中で、C++の言語機能を一通り
理解して、STLやBoostなどのライブラリをそれなりに使い
こなすことのできるプログラマは何人ぐらいだと推測しますか?
あなたは20万人の中で上位何パーセントの層に属しますか?

269 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:41:05 ]
マ板で聞いてこいやボケが

270 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:49:52 ]
今は高度なソフトウェアの需要が少ないので
(そういう会社の数が激減したと言うか)
国内でスキルを持っていても活躍の場があまりない気がする。



271 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:53:09 ]
>>269
やっぱり?でもマ版に入り浸っている人じゃなくて、
具体的なC++の質問に答えられる人にききたいんです。

272 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:58:25 ]
C++経験者が30%、うち上記条件を満たす人間が30%と感覚で決めつけたとして
20*0.3*0.3=1.8くらいとかだったらいいなぁ・・・

273 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:02:42 ]
boostともかく、STL使わないC++って、どういう使い方してたら発生するんだろう。
C++経験あったらSTLも使ってるんじゃないの? (単純な疑問文です。)

274 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:11:44 ]
MFCオンリーなんて人もいるんじゃね?

275 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:16:14 ]
なるほど。

276 名前:268 [2008/03/18(火) 02:19:12 ]
>>273
STLを使ってるといってもいろいろなレベルがあります。
vectorぐらいは誰でも使っていると思いますが、
コンテナとアルゴリズムを駆使して、コンパクトで
エレガントなプログラムを書くとなるとどうでしょうか?

>>268では "それなりに使いこなすことのできる" 人の数
を問題にしています。

277 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 03:55:52 ]
STLのアルゴリズムは必ずしも最適解ではないからなぁ

278 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 04:54:27 ]
>>268
2000人もいないだろ

279 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 05:10:49 ]
わがまま言ってんじゃねえ
マ板に行け

280 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 09:06:30 ]
STLやBoostを使えるのが、プログラマ人口の上位とは限らんすぃ



281 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 10:10:38 ]
しかし、C言語しか使えない、もしくは、C/C++両方使えないのは、下位ケテーイ。

Boostって組み込みじゃ氏んでもツカエンよな。

282 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 10:34:45 ]
C や C++ が必要とされる分野って、コンパクトでエレガントなコードよりも
効率が良くて高速なコードが要求されることが多いような気がする。
両立できればいいんだろうけどさ。

283 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 10:39:42 ]
つまり、C/C++でエレガントなコードが書けたら上位けてーい。

284 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 10:40:29 ]
C や C++ が必要とされる分野って、
開発環境がそれしかサポートしてないだけ

285 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 10:46:29 ]
つまり、今の組み込みの分野。

C++はじまた。

M$/V$オワタw

286 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 19:49:08 ]
>>268
活躍の場って組み込み系か?
DB系だとCなんかよりJava VB C#のほうがラクだし需要あるし
ダカラナニ?って感じなんだが。
仮にその上位ってやつだったとして
給料が高くなる保障があるわけでもないし
くだらない話題だと思わないわけでもないかもしれない可能性がある

287 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 22:12:54 ]
組み込みでC++使うにはSTLやBoostを使いこなす事とは別ベクトルのノウハウが要るよ

288 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 23:14:02 ]
言語に特化した知識だけじゃたかが知れてる。

でも・・・C++かわいいよC++

289 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 23:14:44 ]
ダメな子ほどかわいい(ぼそ

290 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 23:19:20 ]
STL、Boostがあるからなんとか付き合っていけるんです。。。



291 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 23:21:46 ]
STL、Boost使ってるけど、「shared_ptrを自分で書け」って言われても多分書けない俺はゴミ?

292 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 23:28:22 ]
プログラマとライブラリアンは全然別だから気にすんな。

293 名前:オガちゃん ◆tyvkWCNtzY mailto:sage [2008/03/18(火) 23:39:50 ]
STL/boostは可汎的なライブラリで、これそのものを設計、開発するならそりゃ相当のスキルを要するかも?この世にまだこれらが無かったって前提で
最善の選択肢とは限らないし
だけど可汎的だから使うのはさほど大変じゃないと思う…が、使いこなすのはやはり難しいかも
JAVAのステータスがどんどん上がってC++のオブジェクト指向開発してるPRJ減ってきたような
C++でも構造体をpackしてmemcpyしてるのざらだもんなあ
今のPRJはユースケース駆動モデル(Rational統一プロセス)でOOPに加えてAOP的発想あるが…
スレ違いスマソ

294 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 03:27:01 ]
テンプレートが絡むとソースが美しくないんだよなぁ、なんか。

295 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 04:13:55 ]
おまえさんの美意識は知らんが、
型指定が冗長だからtypedefかヘルパー関数の嵐になるのは仕様。
C++0xのautoで解決されるのも仕様。
既存のライブラリをC++0x用にせっせと書き直す作業が待っているのも仕様。

296 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 07:23:45 ]
解決はされないんじゃないかなあ。
メンバ変数に書く際には auto じゃどうしようもないだろうし。

297 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 09:42:06 ]
template typedefが欲しい

298 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 10:15:40 ]
>>295
既存のライブラリをわざわざC++0xでしか通らないように書き換えたりするの?

299 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 10:20:21 ]
>>295
コイツは。。

300 名前:デフォルトの名無しさん [2008/03/19(水) 15:42:21 ]
この言語って機能が多すぎて大人数でプログラム組むの大変じゃない?



301 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 15:45:27 ]
なんで?

302 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 15:50:05 ]
多分MFCの話じゃね?それならそのとおり。

でも純粋C++なら安定部品を作ればよいだけ。

303 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 16:22:00 ]
一口に「C++使える」と言っても、人によってその差は大きいから、
できる人からできない人まで集まってしまうという点では大変だと思っている。
同じようなレベルの人同士でならそう大変でもないはず。

304 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 17:28:32 ]
まるで自分はできるとでも言ってるかのよう

305 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:01:01 ]
CとC++の差が分かってない人がほんと増えた気がする
だから困るかっていうと困るほどのものでもないんだが

306 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:02:16 ]
>>305
C++がUNIXモンリーで単なるC言語のプリプロセッサだったころの、
クラスって何、
の時代しってんのかぁ?ゴルァ。

307 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:05:18 ]
俺が憶えた頃は、まだ一部のコンパイラでは
C++から一旦Cのコード吐いてからコンパイルしてたな。
もちろん例外処理なんて粋なもんは無かった。

308 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:06:45 ]
まるで見当違いな>>306の突っ込みはいかがなものかと思う今日この頃
>CとC++の差が分かってない人がほんと多かった気がする
                           ~~~~~~~~
なら分かるんだけどね、ってどうでもいいスレ違い続けてんじゃねえ!ゴルァ。

309 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:09:53 ]
いちいちコメントしないと気がすまない奴らばかりだな
STLの話しろや

310 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:10:51 ]
イテレータンが無いとSTLの話できない椰子らw



311 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:14:28 ]
できるできないとかどんだけ春なんだよ。
できて当たり前。
できないのは単にやってないか馬鹿だから。

312 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:17:11 ]
STL、boostに関しては、それはいえない。
一通りやり終えるまでどんだけ。

313 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:17:16 ]
でもさSTLとかも使ってないと忘れるよな。
おれ深く勉強したけど、もう1年くらいやってないから
忘れてるわC++ アハハハ

314 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 18:19:51 ]
STLでなくても、1年あれば何だって忘れる。

315 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 19:00:49 ]
スマートポインタが用意されているのに使わない人がいるとちょっとあれーと思ってしまう。

316 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 19:12:57 ]
shared_ptrはBoostだから使わなかった、使えなかったという人がいたら、
TR1の普及で使うようになってくれるといいな。

317 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 19:19:42 ]
Boostがなくてもメイヤーズの本見て作っておけばいくらでも使えたはず。

318 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 19:54:44 ]
Boost/TR1が多数の現場で使えるようになるまで
何年かかることやら

319 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 20:46:08 ]
shared_ptr っぽいものは boost とは別のライブラリに用意されてるけど
ほとんどの人が使ってない罠。
まずは啓蒙からだな・・・。

320 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 20:51:21 ]
shared_ptr使わないなんてあり得ないな、おれは。自分でdeleteなんて嫌だよ。
もうそんな時代ではない。細部を理解する必要はあるけど。それこそメイヤーズ
みたいな貴重な本があるし。



321 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 20:55:19 ]
Boost だから使えない、というような微妙な状況のときは、
自家製の refcount_ptr とか適当に作っちゃうなぁ。
代入や解放をスレッドセーフにしたいときとかも。

322 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 20:56:42 ]
でも、scoped_ptr や auto_ptr で済む状況も多いと思う。
shared_ptr まで必要になるのって意外と少ない気がする。

323 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:00:51 ]
Boostだって素人が作ってるわけではないし、むしろエキスパートが作ってる
んだから何が不満なんだよと言いたい。それとも何処の馬の骨とも分からないやつ
が作った自作ライブラリのほうが安全なのかよと。上司に言いたい。

324 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:05:42 ]
こういった場合安全性よりライセンスが問題になることが多いが、
boost のライセンスってゆるゆるだよね?

325 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:13:21 ]
場合によっちゃあソースコードレビューの対象にせざるを得ないから
(& Bootst はレビューしたくないから) 自前で書く、ということもあるな。

326 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:14:49 ]
あれだけレビューされてる boost を
もう一度レビューするのも車輪の最発明と大して変わらない作業のような。

327 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:16:08 ]
ライブラリのプロが書いたソースを一般レベルのプログラマがレビューするのって
滑稽じゃね?と上司に言いたい。

328 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:18:08 ]
STL もレビューしてんの?
あんなの読みたくもないが。

329 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 21:56:08 ]
勉強になっていいじゃん >327

330 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 22:12:25 ]
まあ勉強会としてはありかもしれない,、。



331 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 22:34:26 ]
VS付属とSTLPortの実装を比べた事はあったなー。おもしろかった

332 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 05:11:22 ]
小ささと速度を求めて、shared_ptr => intrusive_ptr => 俺スマートポインタ、と移行したことならある。
intrusive_ptr::operator=()が、いわゆる「スワップ技法」使ってるんだけど、これがBCB6だと遅くて。
こういう「局地的な場面」でまでboostを絶対視するのはいかんってことだね。
概ね信じろ、しかし盲信はするな、と。まぁ当たり前のことなんだけど。

333 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 05:25:05 ]
ローカルな話題を堂々と振られるのもあれだな

334 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 05:30:12 ]
「使う」話は遍くローカルだよ。

335 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 05:55:08 ]
ローカルの事情で使いものにならないこともあると
言いたいのだろうけどそんなのはローカルの事情でしかないだろう。
一々ローカルにかまってたら標準の意味がないだろうよ。

336 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 06:14:08 ]
>>332はローカルな事情をタネにして
>概ね信じろ、しかし盲信はするな
っていう一般的な意見を述べてるだけだろ

話題自体はローカルじゃないし、標準がどうあるべきだという話もしてないと思う

337 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 06:31:42 ]
>>336
その結論に持っていくネタがなんだかなって話だろ?
俺も小ささとか速度で難癖つけるのはどうもずれているような気がする。
誰も速度が速いとかオールラウンドに使えるという話はそもそもしていないんじゃね。

338 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 06:34:34 ]
>>335
> ローカルの事情で使いものにならないこともあると言いたいのだろうけど
いや、boostの実装には「手を抜いている」部分もあり、必ずしも細部までエキスパートの優れた仕事って
わけではない、という話。
つまり「ローカルの事情の話」ではなく「ローカルの事情を通して知ったboostの実装の話」ね。
だから「boostの話はスレ違いだ」は受け入れるけど、「上司の意向の話」以上にずれた話題と思われるのは心外だなw

そこから来る結論は>>336の通り。初心者がboostへの信頼を信仰にまで高めちゃいそうな流れだったから、
思考停止だけはしちゃいけないよね、というレスが事例付きで一つくらいあったほうがバランス良いと思ったんだ。

339 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 06:41:18 ]
あ、すまんもう一つレスが入ったか。

>>337
難癖ではないよ。boost大好きだし。
> 誰も速度が速いとかオールラウンドに使えるという話はそもそもしていないんじゃね。
いや、>>332もそういう話はしてない。
「エキスパートが作ってるという話」「ライブラリのプロが書いたソースだという話」の一環として書いた。

エキスパートとかプロっていう表現が踊り出すと(この表現自体は正しい)、ある種の人間に
変な思考を植え付ける結果になることがよくあるんだ。
冷静に判断しなきゃいけないところで「boostのほうが凄いに決まってる!だってエキスパートが作ったんだもん!」
「だってライブラリのプロが書いたんだもん!」みたいなね。

そんな馬鹿は放っておけばいいという意見もあるだろうけど、でも俺は今回、信じすぎは良くないからね、
という一言があったほうが、流れとして適切だと判断したから書いたわけ。

340 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 07:18:46 ]
車輪を再発明するよりSTLやboostで合うなら使っていこうよ
レビューされているぶん、俺たちが会社で書く似たようなコードより信頼性は高いだろう
これだけの話だろ

車輪が環境に合わない場合は自作するしかないけど(>>333 の場合)
自分で書くよりは信頼性が高いだろうというだけの話が
何故信仰や絶対という話になるのか理解に苦しむな…



341 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 07:20:39 ]
リンクミス >>332 の場合

342 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 07:35:59 ]
>>340
そう、それだけの話。
で、>>332も「それだけの話」なんだけど(boostは概ね信頼できるという「事実」に対して、
必ずしも我々を越えちゃいないという「事実」を例示付きで添えただけ)、妙に突っ込む人がいて長くなってる。

343 名前:340 mailto:sage [2008/03/20(木) 07:41:09 ]
>>342
俺も突っ込んでる一人なんだが…w

344 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 07:47:11 ]
>>343
見ればわかるけど・・・。

345 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 07:50:01 ]
この環境ではスピードが遅くて使い物にならん!だから自作した!
boostは盲信するな!絶対視するな!
こんなイミフな展開にツッコミ入れない人間がどこにいるの。ワロス

346 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 07:52:42 ]
イミフな展開になるように言い換えてるからじゃね?
そもそも>>332一つなら「展開」でも何でもないよ。単発だもの。「展開」は皆で「作った」んだよ。

347 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 07:54:29 ]
なんかもう、1レスずつ突っ込み方が違っちゃってて、
数撃ちゃ当たる状態だな。そんなに必死に「やり込めたく」なるのかなぁ、俺のレス。

348 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 08:12:22 ]
初心者です。STLのエラーメッセージが黒魔術で困っています。
皆さんはどのように理解してデバッグなさっていますか?

349 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 08:30:04 ]
Effective STL に「STLのエラーを読めるようにしよう」みたいな項目がある。
要約すると、 std:basic_string< 〜 > とかを string に置換して読むこと、
こういうエラーが出たときはこういうミスを犯している可能性が高いっていう対応を知ること。
俺はエラーメッセージは読まずにえらーが出てる最初の行だけ見て直すけどw

350 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 09:34:19 ]
>>348
エラーメッセージは見るな
自分のソースを見ろ




351 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 09:35:11 ]
C++ Templateにも追い方が少し書いてあったと思う

352 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 09:36:01 ]
初心者って絶対自分のコード疑わずに
コンパイラのせいにするよなぁ
C++どころかCの頃からそうだったなぁ


353 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 09:46:10 ]
言語に関らずそうだよ

354 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 10:49:36 ]
VC++だとテンプレートの中でエラー・警告が出たら、
その呼出元も表示してくれるので、
ひとまず自分のソースコードのどこの行が悪いのかはわかる。
あとはにらめっこの始まりなんだけどね。

355 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 12:23:57 ]
とりあえずエラー行を見る。
それで大体の場合は分かる。

それで分からない場合、
次はテンプレートの型とエラーの種類を見る。
長ったらしいテンプレート引数は別に見なくていい。

それで分からない場合にはいよいよテンプレート引数を見るけど、
大体はその中で自分で作ったクラスが悪さしていることが多いのでそれをまず見る。

それでもダメな時は全体を見る。

356 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 13:12:39 ]
const指定が間違ってるとか
名前照合に失敗してるとか
そういうことが多いような

357 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 13:19:10 ]
自作関数オブジェクトをアルゴリズムに適用するときとかね

358 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 13:29:42 ]
>>356
constの有無程度なら「constがある/ない」で警告してくれればいいんだけど、型を変換できないと言われてtypedefしてない型を延々出されると何事かと思う。
もう慣れたけど。

359 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 13:57:09 ]
STLの内部で使ってるの型を吐き出してくれるから、
VS付属→STLPortとか実装を取り替えると同じエラーでもメッセージがぜんぜん違ってくれる素晴らしい罠。

360 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 14:02:01 ]
さてconceptはまだですか?



361 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 20:42:46 ]
boostを盲進、過信するのはやや問題があるとは思う
特に納品物というか成果物としては。いくらboostのライセンスが軽いとはいえ。
boostの一部がTRで採用されて0xに反映されたら標準ライブラリとみなせるだろうけど…
いっぽうで、ツール類作るときは積極的に使用する。
tokenizerとかregexとか、bindなんか使うとやみつきになる

その点、STLはまずコンパイル・リンクエラーなってる場合はほぼ間違いなく自分のコードに問題あり
もしくは、VC++とかBorlandC++とかそういうコンパイラ
でも、テンプレートが展開されたエラーは原因を見つけるのに慣れないと苦労するのも確か。

362 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 20:53:02 ]
>>361 は標準ライブラリを盲信、過信していると思う。

363 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 20:54:40 ]
と凡人プログラマが申しております。彼は自分のプログラミング能力が
ライブラリ作成者よりも優れていると申しております。

364 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 20:55:03 ]
そういうのを盲信って言うんだよw

365 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:07:18 ]
見事に釣られてしまったようです。

366 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:11:49 ]
>>362
361だが、過信してはいないつもりだが、エラーの要因はまず自分のソースを疑うね
その点はboostでも同じだよ
まぁ、そう考えればSTLはバグがないとまでは言わなくとも(実際にある)、自分のソースを疑うってだけだ
だから過信、盲進してるかもな
ただ、boostはコンプライアンス上の問題やらでdefect発生時にどうなのよ?ってだけだよ

技術的な観点では、俺にとってboostはSTLのサブセットだよ。なにせ、boostの開発に携わってるのは
C++標準化の連中なんだから
それに、>>363のいうようにあらゆるケースや検証をして世の中に出てきたSTLと、必要なテストしかしてない
自分の作成したコードが正しいなんて言う根拠はどこにもない
で、>>362はSTLよりも優れたテンプレートを作っていると?w

367 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:18:08 ]
boostはhppって拡張子が嫌い。

368 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:20:04 ]
hppはまだいい
ippってなんじゃらほい

369 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:23:05 ]
現行STLやboostのメンバー見れば凄いのが揃ってるのはわかる。
コンパイラ作成者やM$のデヴェもいる。

370 名前:361 mailto:sage [2008/03/20(木) 21:32:54 ]
>>367
俺、boost信者になってからは寧ろ好きになったw
だけど、自分のコードはやはり .h を拡張子にしたいね。前プロジェクトではboost使いまくりーの、
.hppを拡張子にしまくりーのだったがw



371 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:40:51 ]
>>366
>boostの一部がTRで採用されて0xに反映されたら標準ライブラリとみなせるだろうけど…
標準ライブラリと見なせることとコードの信頼性に何か関連性はあるのかね、と思ったのよ。

372 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:45:03 ]
>>371
で、boost使ってて何かトラブったことあんの?

373 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:51:19 ]
>>371
すくなくともベンダがリリース前にテストしたという信頼性は担保されるだろ

374 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:54:34 ]
.h はCとの互換性を考えてあるヘッダのみに使って欲しいなあ
C++専用のヘッダは hpp とか hh とか hxx とか使って欲しい

# emacsで開くとc-modeになってしまったという経験がある
# もちろんファイルの先頭にモードを書いておけば済む話だけども


375 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 21:57:05 ]
要件を満たすための全てのテストが通れば、boostを使っていようが自分で作ったライブラリを使っていようがok
自分で書いたコードが正しいと確信するための作業をboostにも適用すればいいと思う

…標準ライブラリもいろいろで、C++の仕様見てないんじゃないかと疑いたくなるようなのもあるよ

376 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 22:05:07 ]
>>372
逆。
標準ライブラリと見なせなくても boost には標準ライブラリと同等の信頼性はあると思っている。

377 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 22:14:20 ]
boostっていっても信頼性は一様じゃないと思うが
Boost.PPの滅多に使われないマクロあたりに嫌なバグが潜んでたとしても驚かないな

378 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 22:27:47 ]
>>374
# vimのcpp用indentスクリプトの貧弱さは泣けてくる

379 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:22:49 ]
まあ、昔からあってさらに頻用されてるやつは十分信頼性あると思うけどね。

380 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:27:46 ]
っつー訳で
auto_ptr
は使うなと



381 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:39:18 ]
>>374
はげど!
C互換もないのに.hって何だよ?と。

しかしライブラリを見てたらだんだん
ヘダファイルに拡張子なくてもよくね?と思えてきた

382 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:40:52 ]
>>381
エディタで開くときに面倒・・・ただそれだけ。

383 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:46:18 ]
ファイルを分類したいときも拡張子が無いと困るな。

384 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:47:13 ]
拡張子に縛られてるOSは大変だな。

385 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:55:42 ]
ファイル実体内にメタデータ仕込むとかも論外だけどな

386 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 23:58:24 ]
ファイルシステムに組み込むよな、普通。

387 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:03:46 ]
>>385
それってファイル壊してない?そんなOSがあんの?

388 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:03:49 ]
拡張子だと気軽に書き換えられるからちょっと楽かも

389 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:08:28 ]
xxx.tiff

xxx.jpg

「劣化しますがよろしいですか?」
(OK) (キャンセル) (pngにする)

そんなOSがあったら、使いたくはないが、触ってみたい。

390 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:10:13 ]
マックバイナリというものがあってだな



391 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 00:12:35 ]
boostの主要な部分って、仕様は固定されてるの?
結局、そこが一番問題じゃないかね。

392 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 02:08:23 ]
そういや、std::auto_ptr使うような場面でboost::shared_ptr使った時、
実行コスト的にはやっぱり不利になるんかな?
大した違いじゃ無いだろうけど、ちょっと気になる。

393 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 05:31:04 ]
なる

394 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 07:07:25 ]
shared_ptr の初期化にはメモリ確保が余分に必要。
参照カウンタが0になった時にはメモリの解放が余分に必要。

395 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 09:32:33 ]
>>387
9までのMac OSってそうじゃないの?

396 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 10:08:28 ]
>>394
あと削除子保持するコストも必要だと思う。

397 名前:オガちゃん萌え ◆tyvkWCNtzY mailto:sage [2008/03/21(金) 19:34:49 ]
Windowsならともかく、UNIX系は拡張子なんて慣例で付けるものでどうでもいい
が、やはりC++とCのヘッダファイルを区別するのに、hとhxxにしときたい
JAVAとかC#プログラマとかはC/C++でc/cpp、hのペアのファイル直すのがめんどいらしい

398 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 20:20:44 ]
>>395
違うよ。
いわゆるMacBinaryはデータフォークとは明確に分離してる。
まあ、他のプラットフォームにしてみれば異質なものに代わりはないけど。

399 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 20:48:12 ]
execが最初の2byteでシェルスクリプトを判断するようなものかな?
どうでもいいけど

400 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 02:44:49 ]
どっちかと言うと、ファイルのプロパティとしてファイル名やパーミションやタイムスタンプがあるように、
ファイルタイプとクリエータがある感じ。
MacBinary形式と言うのは、これらのプロパティを128バイトのヘッダとし、その後にデータフォークと
(必要なら)リソースフォークを連結した特殊なファイル形式のこと。



401 名前:オガちゃん萌え ◆tyvkWCNtzY mailto:sage [2008/03/22(土) 10:16:01 ]
>>400
ファイル名、タイムスタンプ、権限や属性はファイルシステムで管理しているがMacは違うの?
ところで、list.sort()やalgorithmのsort条件を関数オブジェクト使って決めると思うが、
関数オブジェクトという言葉が通じない人が多い
operator()のオーバーロードってことではファンクタというほうがわかりやすいのだろうか?

402 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 14:22:24 ]
関数オブジェクト自体は理解してるの?
ちなみに自分はファンクタという言い方はあとで知った。

403 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 14:53:28 ]
関数オブジェクトって関数をオブジェクト化したみたいで好きじゃないな。
コード上で関数のように使えるだけで、関数とは全く関係ないのに。

404 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 15:19:09 ]
作るのが面倒って点に関してはあまり好きじゃないが、
やってることはエレガントだとは思う。

405 名前:デフォルトの名無しさん [2008/03/22(土) 17:22:14 ]
クラスと何が違うのかわかんね

406 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 17:44:24 ]
特別学級みたいなもんです

407 名前:オガちゃん萌え ◆tyvkWCNtzY mailto:sage [2008/03/22(土) 20:16:13 ]
>>402
ファンクタを理解しているか?って言われれば、理解しきっていると言えるほど俺は自信ないw
Cの時によく使った関数ポインタのような、イベントハンドリングのロジックを外部化したり、コールバックなんか
に使うもんだという理解が強いかな
あとは、ポリモーフィズムとして同一で処理ロジックだけカスタマイズするときにファンクタとすることが多い
話は変わるが、組込み系ではメモリシステムをラップすることが多いとおもうが、
operator new()、operator delete()、operator new []()、operator delete []()なんかをオーバーロードするときは
EffectiveC++なんかを読み返してしまうよ…
メモリシステムといってそこでリークやオーバーフロー、未初期化アドレスアクセスなんかしてたら偉いことに
なってしまうし
そもそも、自分はC++、STLを理解しきっているとは思ってないよ
先週その典型例があった、C++といいつつCでマクロを書いたのだが、printf()をラップして可変引数をログ出力
するってやつ。stdarg.hの使い方を分かってなかったw
そういう>>402は?

408 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 20:22:45 ]
stdarg.h 使うってことはマクロじゃないんでない?
まあ、その関数をさらにマクロでラップしてるんだろうけど。

409 名前:402 mailto:sage [2008/03/22(土) 20:26:05 ]
いや、402は、「あんたが理解してるか?」の意味じゃなくて、
「関数オブジェクトという言葉が通じない人は関数オブジェクトの存在を知らないから通じないんじゃない?」っていう意味です。

関数オブジェクトという用語を知らずに関数オブジェクトを使うかなあって思ったから。

自分も理解しきってないよ。簡単な関数オブジェクト作れるレベル。

410 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 20:51:00 ]
なんで雑談してんの?



411 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 23:17:29 ]
相談が無いからだろう

相談できる雰囲気でもないがね

412 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 00:44:28 ]
何で雑談しているのかを聞く それも雑談なんじゃね?
自分の胸に聞くのがはえーんじゃね?

413 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 01:03:59 ]
>>407
ひょっとして有名人?
関西でPGでかつどうしてんの?

414 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 01:10:46 ]
とりあえず2期のオガちゃんは萌えた。

415 名前:オガちゃん萌え ◆tyvkWCNtzY mailto:sage [2008/03/23(日) 20:37:34 ]
>>409
ざらにいるんじゃないか、ファンクタを知らないPGは
だけど、今のPRJはユースケース駆動モデルでOOPかつAOP的コンセプトを多分に取り入れてる
から、ファンクタや関数オブジェクトの名前すら知らないようではさすがにPGとして使えない
デザインパターンの幾つかを理解しているくらいは最低求められる
とはいいつつも、知らずにそういうパターンを使っているってことは経験あるとおもうよ
大抵はライブラリとして用意されてるものを別途作って無駄なことやってることになるんだろうけどねw

>>410-412
まぁ固いこと言わないでマターリやろうよ

>>413
いや、有名人でもなんでもないよw
出身地は関西だが、都内で仕事してるしさ

>>414
オガちゃんいいよな!

416 名前:オガちゃん萌え ◆tyvkWCNtzY mailto:sage [2008/03/23(日) 20:41:16 ]
>>408
可変引数を使うのにstdarg.hを使ったよ
va_start()やらはマクロを通して最終的にコンパイラ組込み型だからさ
ログ吐き用とはいえ、%SSっていう変なリテラルを敢えて作って、UTF-16の文字列をUTF-8(ASCII)
に変換してログ出しするってのを作ったわけなのだが、案外はまってしまったw

417 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 12:37:23 ]
緒方賢一に萌えるスレはここですか?

418 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 00:46:11 ]
そうです。

419 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 01:48:57 ]
vectorにデータを追加した時にメモリ確保に失敗した場合、検出する方法ってありませんか?
newでいうbad_allocの例外をキャッチするような感じ。

420 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:12:07 ]
bad_alloc捕まえれば?
hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200112/01120006.txt



421 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:18:03 ]
>>420
な、なんだこの低レベルなやり取りは…

422 名前:419 mailto:sage [2008/04/16(水) 02:26:03 ]
>>420
お!
VC2005で確認しました。
STLでもbad_allocスローしていたんですねw
あざ〜す♪

423 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:58:35 ]
アホすぎる

424 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:43:19 ]
VC6 ではデフォルトで new が bad_alloc 投げなくて
アクセスバイオレーションになるのは有名な話だけどね。

425 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 07:17:17 ]
で?何処にVC6だという前提が示されていたの?

426 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 08:01:17 ]
なんだこの意味不明の質問

427 名前:デフォルトの名無しさん [2008/04/16(水) 20:34:00 ]
で、どこにVC6でないという前提が示されていたの?


とでも言ってほしんだろうか
おまえらもっと仲良くしろよ
タダでさえ過疎ってんのに

428 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:03:38 ]
424 は 豆知識としてとらえるのが普通だと思うんだけどな。
419の環境がどうとかじゃなくて。

429 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:01:51 ]
常識人は一人だけ。残りは全員アホ。
そんな微妙すぎるリンクを貼った>>420がまず意味不明。
>>424の内容はもっともだが、VC6世代なら誰でも知ってる常識レベル。
なぜあえてそこだけピックアップして言及したのか意味不明。
何にカチンと来たのか、その後の煽り合いも意味不明。
つまりお前ら全員意味不明。

430 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:17:11 ]
なぜあえて、というところは>>419>>420>>422の「bad_alloc がスローされるんだ♪」
という流れを見ての、ちょっとした老婆心じゃね?



431 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 00:17:46 ]
>>429
要するに、君は色んなことの意味がことごとくわからない人、なわけだよね。

可哀相だけど、馬鹿につける薬って無いらしいから・・・合掌。

432 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 02:22:42 ]
おまえら昔はぬるぽ返してたんだよとか
今でもnothrowとかできるんだよとか

ちゃんと教えてやれよ

433 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 02:28:35 ]
この程度で煽りに見えるとか

434 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 07:10:34 ]
VC だとぬるぽは VC6 までだね。
だからこそ STL で >>424 が起こる訳だが。

435 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 07:23:43 ]
>>433
ま、煽りではあると思うよ、実際。
煽りと感じないことをアピールして煽り耐性自慢してもしょうがない。

436 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 19:15:49 ]
仲良くしようよ。

437 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 20:11:21 ]
friend関数を

438 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 11:08:29 ]
窓から

439 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 11:12:05 ]
こんにちは

440 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 12:20:53 ]
やあ、おぜうさん



441 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 18:48:43 ]
まあ、ごきげんやう

442 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:21:42 ]
よひてんきですね

443 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 12:47:47 ]
庭にはてふてふも飛んでます

444 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 13:36:50 ]
std::list::erase の引数の型は std::list::const_iterator の方が適切ですよね?


445 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 13:42:02 ]
なんで?

446 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 14:58:19 ]
std::list::erase() に渡した反復子の参照先が将来的に変更されることがないからです。


447 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:09:25 ]
constなポインタでもdeleteできるから、
それもある意味整合性があると言える気がする。

448 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 20:57:09 ]
同じタイプのmapが2つあったときに、
片方のmapにもう片方のmapの要素を全部移動する方法ってありませんか?
swapみたいにコピーしないで済む方法があればいいんですが。



449 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:28:33 ]
swapじゃダメな理由は?

450 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:29:25 ]
joinしたいからswapじゃダメなんじゃね



451 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:38:01 ]
>>449
450さんの言われたとおりです。

限定的にしか使わないクラスをsecondにしてるので
operator=オーバーライドしてコスト下げるしかないかなぁとは思っています。

Boostとかであればそれでもいいんですが。

452 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 23:39:45 ]
second をポインタにして、
実体はリストに保持しておくとか。

453 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 01:25:04 ]
STLportのVC9正式対応版はよくれ

454 名前:デフォルトの名無しさん [2008/05/05(月) 17:27:47 ]
typedef std::iterator<std::bidirectional_iterator_tag, char> MyIterator;

MyIterator it;
*it = 'A';

これは、何がいけないんでしょうか?

455 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:38:17 ]
int* p;
*p=0;

これのどこがいけないと思いますか?

456 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:44:16 ]
なぜ質問に質問でこたえるのですか?

457 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:58:26 ]
質問に質問で答えてはいけないのですか?

458 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 18:03:57 ]
>>454
(っ´▽`)っ
itの記憶領域確保しろよ☆
it = new MyIterator('A');
かな?

459 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 18:11:05 ]
え?

460 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 18:13:01 ]
>>455>>458
そういう問題じゃないだろ
そもそもstd::iterator<>はインスタンスを作ることを意図したクラスじゃないし、
operator*も定義されてない



461 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 18:19:39 ]
>>460
いや、阿呆なのは458だけでしょ。
>455の例えはよくわかる。

462 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 18:23:11 ]
俺にはさっぱり分からん

463 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 18:23:46 ]
>>461
(っ´▽`)っ
そうだよ。(っ´▽`)っがヴァカなだけだよ

464 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 18:26:04 ]
(っ´▽`)っ
だってC++よくわからないんだも〜ん☆

465 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 18:26:07 ]
m9('A')

466 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 19:29:39 ]
>>454
じゃあ、どんな動作を期待しているのか述べてみよう。


467 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 20:51:15 ]
>>461

胴囲

468 名前:デフォルトの名無しさん [2008/05/07(水) 21:58:26 ]
>>455の例えは全然わからんな。
何が言いたいの?

469 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:01:40 ]
何も指してないイテレータを参照剥がししてどうすんだ?
わかりやすくポインタで例えてやろうかあぁ?

470 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 06:00:33 ]
もし>>469なら、やっぱり的外れだろ
std::iterator<>はそもそもイテレータじゃないんだから



471 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 07:23:47 ]
ぼくにも分かりやすいようにガンダムで例えてください

472 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 11:49:01 ]
ガンダムの格納庫はあるのに、
肝心のガンダムがない

473 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 12:48:04 ]
std::string とかでぬるぽ使えないのはなんで?

474 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 12:49:07 ]
>>473
どういう動作をさせるためにどうやって使いたいのかわからない。

475 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 14:19:39 ]
>>474
const char * にNULLを渡すか空文字を渡すかで動作が違う関数があると、
それをstd::stringでラップするときに微妙に困るじゃない。

476 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 14:36:20 ]
boost::optionalの出番か?

477 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 15:07:11 ]
>>475
class my_string : public std::string {
bool m_is_null;
public:
my_string() : m_is_null(true) {}
operator=(const char* p) { if (p==NULL) set_null() else set_string(p); }
operator=(const std::string& s) { set_string(s); }
void set_null() { m_is_null = true; clear(); }
void set_string(const std::string& s) { m_is_null = false; *this = s; }
bool is_null() { return m_is_null; }
}

478 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:30:54 ]
>>477
実は同じのを作って使ってるんだ。でもありがとう。

479 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 19:58:46 ]
Concrete Containerをplubic継承www

480 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:02:34 ]
と笑う人もいるので、抽象化して
template <class T> Nullable : public T
{
 ...
};
などしておいてはどうだろうか



481 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:14:25 ]
仮想デストラクタのないクラスはpublic継承しちゃだめだろ常識的に考えて・・・

482 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:16:28 ]
delete されるような場面でアップキャストしなけりゃ良いんじゃね?

483 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:16:43 ]
すると笑う人は笑わないのか?

484 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:26:28 ]
結局boost::optional自作になるのか

485 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 20:42:08 ]
なんで継承したがるんだ

486 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:01:00 ]
楽にかつ安全に特徴を追加する方法って無いのかねぇ…

487 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 21:33:02 ]
普通にオーバーロードを活用すればいいんじゃね? >486

488 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 22:14:23 ]
std::string * でいいような…それかboost::optional<std::string>

489 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 01:12:47 ]
const char *でいいだろ・・・

490 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 02:04:55 ]
話は逸れるけど、逆にnullが存在し得る参照型Stringを持つJava/C#を触ると、
nullの存在がうっとおしいと思うときがあるから不思議。



491 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 07:19:30 ]
ぬるぽ

492 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 08:13:15 ]
>>490
そうそう、無効値としてnullか""のどちらにするか結構悩む。

493 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 11:55:38 ]
std::iterator は仮想デストラクタないけど public 継承していいんですか?

494 名前:デフォルトの名無しさん [2008/05/09(金) 13:04:18 ]
EBOがあるからいいんじゃないか?

495 名前:デフォルトの名無しさん [2008/05/09(金) 13:06:26 ]
間違えたw
気にしないで・・・。

496 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 13:17:01 ]
>>493
typedefしかしてないクラスだから、public継承しないと意味無いと思うけど。

497 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 15:25:34 ]
このほうが安全じゃない?

class my_iterator : private std::iterator<Tag, Type> {
typedef std::iterator<Tag, Type> super_t;
public:
using super_t::iterator_category;
using super_t::value_type;
using super_t::difference_type;
using super_t::pointer;
using super_t::reference;
};


498 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:20:17 ]
std::iterator や std::unary_function のようなクラスは
protected な非仮想デストラクタが定義されていればいいのに。


499 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:23:23 ]
>>498
自分が何言ってるかわかってるのかw

500 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 18:53:04 ]
それ自身インスタンス化することないし、基本クラスとして使うこともないし
いいじゃないの?



501 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:07:08 ]
データメンバもメンバ関数もないクラスにアップキャストしても
何もいいこと無いからな

502 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:56:40 ]
マーカインタフェースという概念があってだな。

503 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 20:22:33 ]
>>499
C++ Coding Standardsの50項目目に紹介されている。

504 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 20:30:15 ]
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1755.html#257
で提案している人がいますね。
反論もあるようです。


505 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 21:04:17 ]
反論の根拠ってなんでしょうか。

506 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 21:04:56 ]
>>504に書いてある

507 名前:505 mailto:sage [2008/05/09(金) 21:13:02 ]
そこの部分だけ一回で理解できなかったのですが、理解できました。ありがとう。具体的なケースはよく分かってませんが。

508 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 02:18:22 ]
ttp://www.wakhok.ac.jp/~sumi/stl/header/string.html#find
ここを見て、stringのメンバ関数findの実装が知りたいと思い、
stringファイルの中を検索してみたんですが見つかりません(環境はVC2008EE)。
find関数は廃止されちゃったんですか?

509 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 02:27:12 ]
VC++ならコードを書いて、右クリックの定義へ移動が便利。

510 名前:508 mailto:sage [2008/05/10(土) 02:36:53 ]
thx
xstringファイルに定義されていました。
インクルードの経路が複雑・・・。



511 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 11:21:32 ]
>>482
>ほとんどの台は左第一停止で引き込み100%だったっしょ。(チェリーバーは順押しで引き込み100%)
いや、だから「すげー細かい」ってことだったんで・・・
スーパーヘビーメタルについては「リプor緑/リプ/リプ」がJacInなんで引き込み100%かと・・・
www.pachinko-club.com/gallery/kisyu.php?id=603803
ミラクルUFOに関してはわからず・・・

>初BET枚数の異なる2種類ボーナス △ デビルメイクライ3 ロデオ 4種類REGの内、1つが1枚、他は2枚
リオパラダイスがBIG/REGでBET枚数違ったような・・・(リオが3月でDMCが6月)

512 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 12:34:56 ]
業界初スレか。珍しい誤爆だなあ。

513 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:50:42 ]
ごめんなさいorz

514 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 19:18:19 ]
やっべ何言ってるかさっぱり分からんw
うちらも外から見たら同じなんだろうけど

515 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 22:31:28 ]
>>514
> うちらも外から見たら同じなんだろうけど
むかしガイドライン板に「一度も行ったことない板に行ってみるスレ」ってのがあって、
この板を覗いた奴の感想は「わけわからん。半分ぐらい日本語じゃない」だったなw

516 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 23:07:22 ]
マジでまったくわからんなw
まぁ、俺はこの板の内容も半分以上わからんが

517 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 02:54:05 ]
そういわれるといかにも初心者丸出しな質問でさえ高度に見えてくるぜ

518 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 01:01:43 ]
す、すいません・・・
STLをかじり始めの者なのですが、質問があります。
std::ofstreamだのstd::wofstreamだのをいじってみたのですが、
どうしてもユニコードでファイル出力ができません。
std::setlocale("japanese")とやってみると、どうやらshift-jisの
テキストが出力されてしまうみたいなんですが・・・。
STLを利用してユニコードのテキストファイルを出力するには
どうすればいいのでしょうか?よろしくお願いします。
ちなみにVC9を使用しております。

519 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 01:28:34 ]
>>518
ストリームをテキストモードで開いているとUnicodeからANSIへの変換が暗黙のうちに行われます。
バイナリモードで開くとこの変換は行われません。

520 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 02:03:53 ]
wchar_tはUTF-16だったりUTF-32だったり処理系定義だということに注意。



521 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 02:08:04 ]
>>518
VC限定ならpubsetbufで大丈夫なはず。
msdn.microsoft.com/en-us/library/tzf8k3z8.aspx
ただしVCのバージョンによっても挙動が違ったはず。
binaryでも大丈夫になったのかな?

最終手段としてはwchar_t*をchar*に無理やりキャストして書き込むとか。

522 名前:518 mailto:sage [2008/05/13(火) 03:33:12 ]
>>519
>>520
>>521
のみなさん、返答ありがとうございました。バイナリで書き込まない
といけなかったのですね・・・。>>521さんの貼り付けてくれたサンプル
コードでなんとか分かりました。やっとUTF-16のテキストファイルを
作成することができました。ありがとうございました。


523 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:40:07 ]
C#とかの.NET系なら、UTF-16,UTF-8,UTF-32,Shift_JIS,ISO-8859-x,Windows-xxxやら、
システムがサポートする文字コード全て、パラメータ指定するだけで出力出来るんだけどね。

524 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:57:05 ]
つlibiconv

525 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 15:10:11 ]
つICU

526 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 15:18:48 ]
つmlang

527 名前:523 mailto:sage [2008/05/13(火) 18:58:21 ]
C#とかの.NETなら、標準ライブラリのみで、普段入出力に使用しているクラスに
パラメータとして文字コードを追加していするだけでいいんだけどね。

528 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 19:13:27 ]
それだけの理由でC#を使えるようならとっくに使っているわ。

529 名前:518 mailto:sage [2008/05/15(木) 21:06:15 ]
す、すいません・・・
その後、いろいろと読み漁ってみた結果、上記のままの理解では、
このスレを読んでいる、同じ疑問を持った人に、無用な誤解を与える
恐れがあるかも知れないので、分かったことを書いておきます。

std::fstreamなどのストリームの文字コードの自動変換は
std::localeクラスの中にあるファセット(文字セット間の変換、通貨、日付と時刻
などの地域化を司るクラス)と呼ばれる部分で行っているらしいです。
で、文字コード変換を司るファセットはcodecvtと呼ばれており、自分の望んだ
文字コードに変換したい場合は、codecvtの派生クラスを作成するのが、
本来のやり方のようです。で、こんなもんを自分で書くのがよいのか、それとも
既に誰かが書いていて、それを利用できるようになっているのか、というところ
までは、まだよく分かっていません。

imt.uni-paderborn.de/download/solaris/Sun_Studio_11/CD1/kits/ide/packages/SPJAhtstd/reloc/SUNWspro/prod/lib/locale/ja/html/manuals/stdlib/user_guide/loc_io/3_2.htm
d.hatena.ne.jp/Cryolite/searchdiary?word=*%5BLocale%5D
docs.sun.com/source/820-2985/loc_io/19_2.htm

大変お騒がせしました。これにて失礼します・・・。

530 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:15:51 ]
Boost.IostreamsがUTF-8のcodecvtを持っていたはず。
一般のライブラリでの実装と言えばそれくらいしか知らないけど。



531 名前:デフォルトの名無しさん [2008/05/21(水) 21:31:09 ]
唐突で申し訳ありませんが、以下、2点質問させてください。
ご意見で結構なので、よろしくお願いします。

@eraseで、listから登録しているクラスのポインタを削除した場合に、
→リストから削除したクラスのデストラクタはコールされる?
 リストから要素のみ削除されると理解していたのですが、
 VC6.0のSTLのドキュメントを読んだところ、
 N回のeraseでN回のデストラクタが呼ばれると書いてあったため困惑中。

Aマルチスレッドアプリでコンテナなどを用いるのは危険?(VC6.0を想定)
→MSDNにて、eraseを複数のスレッドから同時に実行するとデッドロックする 
 という記載等があったため、少なくともVC6.0のSTLは
 マルチスレッドアプリを作る上で適当でないと思い始めている段階。
 実際、beginなどの引数なし関数コール時にアプリが落ちた経緯あり

532 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:37:54 ]
「listから登録しているクラスのポインタを削除」の意味がワカラン
こういう日本語もワカル人がいるので不思議
そういう人を待て

533 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:41:21 ]
std::list<T>なら、eraseしたときに該当するオブジェクトのデストラクタが呼ばれる。

std::list<T*>なら、該当するオブジェクトとはlistの要素たるT*のオブジェクトであり、
T自体のデストラクタは呼ばれない。
Tオブジェクトのデストラクタが呼ばれるようにしたければ、
boost::shared_ptrでも使えというのがC++の現状。


534 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:42:41 ]
>>531
1. について
ポインタ要素を erase してもデストラクタは呼ばれません。
実体を格納している場合には erase でデストラクタが呼ばれます。

2. について
読み取り専用なら安全です。更新があるなら、明示的に排他制御
しましょう。


535 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 00:29:50 ]
>>533 534
回答ありがとうございます。
概ね、当方の理解と一致しており、胸を撫で下ろしました。

質問事項Aのマルチスレッドでの使用に関しては、
別スレッドでswap/uniqeなどで
iterator iの参照先の内容が変わることを考慮すると、
begin等も容易には使えないですね。

ちなみに、今、他人のソースをレビュー中でして、
人のソースを見ていると、自分の理解が正しいのかどうか
ちょっと不安になってきたりと・・・oTL

536 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 01:10:30 ]
>>535
unique後はそもそもイテレータが無効になるから、マルチスレッド以前の問題だね。

537 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 01:33:51 ]
>>535
スレッド安全性については規格では何も規定していないから、実装ごとにドキュメントを
読む必要がある。ドキュメントに記載がなければ、同時アクセスは一切できないものと
考えたほうがいい。そういう実装もあるので、最大限の移植性が必要なら同時アクセスは
一切できないものと考えるべき。

538 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:03:22 ]
Intel謹製のスレッドセーフSTLがあったような・・・

あとポインタ格納しつつeraseしてもデストラクトする実装ならboost::ptr_listってのがある

539 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 20:39:50 ]
>>537
自分もそうおもふ

540 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:56:49 ]
VC 7.1以降だと文書化されている。
msdn.microsoft.com/en-us/library/c9ceah3b.aspx

あるオブジェクトについて、同時読取り可、単一スレッドの書込み可。
同時書込みや読み書き同時は不可。
スレッドごとに別のオブジェクトを読み書きするのは問題ない。
例外的にストリーム出力は同時書込み可。



541 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:19:18 ]
テンプレートライブラリはクラスのマクロみたいなもんですよね?
コンパイル時に全部展開されるので多用する場合はメモリを無駄に消費しそうなんですが、
比較的大規模なアプリを作るときは、やはりコンパイル済みのライブラリを使うべきなんでしょうか?
例えばMFCとSTLはどのように使い分けるのが賢いんでしょうか。

542 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:48:06 ]
同じテンプレートを同じ型で別の場所でインスタンス化した場合はリンカが重複を除去する場合が多い
なので、規模が大きくなるほどテンプレートのオーバーヘッドの割合は減少すると思う

MFCとSTLでは重複するのはコンテナくらい
コンテナはSTLの方が大分出来が良いので、基本的にコンテナはSTLのを使えば良いと思う
MFCにべったり近い処理をするときなどは専用のコンテナが使いやすいこともあるかもしれない

結局はケースバイケースかな

543 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:08:54 ]
>リンカが重複を除去する場合が多い
重複除去は仕様。必ず行われる。

544 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:22:41 ]
重複除去しないとstatic変数のユニーク性が保証されなくなる。

545 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 06:04:20 ]
>>541
例えば CODE セグメントとか .text セクションが 10 倍になって困るのか?
一割り増しでも困るなら、使うのをやめというたほうがいいだろう。

なんというか、なんでもいいから毎月雑誌読もう。二年もするとだいぶ変わる。

546 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 07:27:13 ]
コピペ思い出した

547 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 12:17:37 ]
boostで重いやつ(regex、spiritなど)を多用するとメモリ不足になる(VC++なら/Zm指定要求してくる)
さらに酷いとコンパイラやリンカが落ちる。
STLレベルならそこまでのことにはならないが、テンプレートの副作用だな。

548 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 12:21:04 ]
lambdaなんか使うとtypoが原因でコンパイラが落ちるからなw

549 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 23:25:01 ]
それはメモリ不足とは別。

550 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:26:13 ]
vectorって単なる動的配列として使ってもOKですか?
たとえば、こんな風にバッファとして直接vectorに値を書き込むのはvectorの使い方として適切?
std::vector<char> TestV;
TestV.resize(MAX_PATH);
::GetCurrentDirectory(TestV.size(),&(TestV[0]));
std::cout<<&(TestV[0])<<"\n";




551 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:27:32 ]
なぜstringを使わない?

552 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:43:05 ]
>>550
vectorの内部バッファの連続性は規格で保証されているのでok
>>551
現時点ではstringの内部バッファの連続性は保証されてなかった気がする。

553 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:44:54 ]
別に連続性云々じゃなくて……
まあいいや。

554 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:54:28 ]
文字配列でない配列にstringを使う方が頭おかしいだろ
そんなコードさわりたくねえ

555 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 09:57:50 ]
vector<char>って書いて有るじゃん

556 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 10:24:53 ]
std::string str=string(&(TestV[0]));
std::cout<<str<<std::endl;
とでも書かないと満足できない人なんだよ、きっと。

557 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 17:11:20 ]
>>553
「まぁいい」って、>>551を書いた根拠がまさにそれで、
立場が無くなって言葉濁してるだけでしょ?w

558 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 18:17:31 ]
も前らおちつくんだ

559 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 18:31:26 ]
&(TestV[0])でポインタ得るのはどうよ


560 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 18:39:25 ]
&TestV[0]



561 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 20:31:27 ]
&*TestV.begin() ならマジックナンバーが現れなくていい

とか言いたいのかな

562 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 21:31:08 ]
vector::data()はまだ規格に入ってないんだっけ?

563 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 22:13:29 ]
>>562
C++0x

564 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 23:33:58 ]
自分用のライブラリで、
2箇所でSTLを取り入れただけで、.libのファイルサイズが3倍になったんだけど
テンプレート導入でサイズ急膨張って常識なんすか?

565 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:08:32 ]
:テンプレートは結局、自動的にコードを生成する機能といえるのでうまく使わないと予想外にコードが大きくなる。

566 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:27:48 ]
STLを使うとコードが10倍に?

567 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 00:28:44 ]
>>564
デバッグ情報じゃねーの?

568 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 02:42:07 ]
元のライブラリが10KByteで30KByteになったとかだったら驚かない。
3MByteが9MByteになったとかだったら、なにやったんだよと思う。

569 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 02:46:15 ]
シンボル情報削れば大したことにならんと思うが

570 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 10:31:54 ]
OSもコンパイラもそれらのバージョンも言わずに3倍とな!?



571 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 12:38:03 ]
コンパイラはg++です

572 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 12:50:12 ]
VC++でexpressive入れた途端に未最適化コードとmapファイルが1MB増えた覚えはある

573 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 21:44:52 ]
>>561
そこは &TestV.front() だろ・・・常考。

574 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 02:04:01 ]
STLスレだけにテンプレ通りの話をしてるのですね

575 名前:デフォルトの名無しさん [2008/05/28(水) 22:48:49 ]
template<class T>
class ListEx
{
list<T> m_list;
list<T>::iterator m_itr;
};

iterator の行でエラーになります。
何がいけないのでしょうか?

576 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:52:47 ]
typename list<T>::iterator m_iter;


577 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:57:16 ]
>>576
ありがとうございます
エラーは出なくなりました。

でも、 typename がなぜ必要なのかわかりません。
どこを調べたらいいのでしょうか?

578 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 23:14:34 ]
>>577
一度、Effective STLを読んでおいた方がいいんじゃないか?

579 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 23:20:22 ]
>>577
www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=C%2B%2B+template+typename&num=50

580 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 23:22:34 ]
型なのかメンバ変数なのかハッキリしろコラァ!
とコンパイラが怒るから



581 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 10:23:16 ]
この文脈では list<T>::iterator のTは型に決まってるだろ、と小1時間ほど問い詰めてやりたい


582 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 10:31:12 ]
Tじゃなくて、iteratorが型かどうかわからない。

583 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 11:24:32 ]
template<typename T> struct list{ enum{ iterator = 0 }; };
だったらlist<T>::iteratorをする時にはtypenameの代わりに何が必要なのか

584 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 12:45:15 ]
>>583
何もいらない。
typenameがないときは、暗黙のうちに値として扱われるよ。例外もあるけど。

585 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 12:50:33 ]
>>581
実際VC++だとtypename無くても通るっぽい?
賢いというよりテンプレート宣言を読むときは「あーはいはい」って感じで
実際に型当てはめてからチェック開始してるのかね

586 名前:デフォルトの名無しさん mailto:sage [2008/05/29(木) 19:36:19 ]
>>582
なるほど、
typename list<T>::iterator m_iter;
は list<T>::iterator がタイプ名だとコンパイラに教えているのか
やっと納得できた


587 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 01:04:10 ]
C++続けるつもりなら読むべきものをまず読んどけ

588 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 02:06:07 ]
SICPですね、わかります

589 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 02:43:43 ]
SICPとはまた時代遅れの物を

590 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:33:28 ]
TR1のお勧め参考書おしえてくれ



591 名前:デフォルトの名無しさん mailto:sage [2008/05/30(金) 22:40:10 ]
>>590
つTechnical Report 1

592 名前:デフォルトの名無しさん [2008/05/31(土) 01:30:22 ]
ちょっと質問です。

STL辺りに「テーブルクラス」なんてありますか?
イメージとしては、データベースのテーブルをオブジェクトとして扱うクラスです。

result = DBDATA.summary(var1) ;
こんな感じです。

593 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 02:36:59 ]
>>590
EffectiveC++の第三版はtr1にちょっと触れてる

594 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 07:56:28 ]
>>592
イメージとしては、データベースのテーブルをオブジェクトとして扱う
クラスはない感じです。

595 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 12:12:08 ]
>>592
STLだけでやるなら、連想系コンテナとアルゴリズムを組み合わせる感じかね。

596 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 12:19:01 ]
>>590
とりあえずboost本買ってみるのは

597 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 14:49:33 ]
>>592
where句が限定されているならmapでいいんじゃないの?
っていうかDB的に使うなら普通にsqliteでも使った方が無難だよ。


598 名前:デフォルトの名無しさん mailto:sage [2008/05/31(土) 15:20:14 ]
O/Rマッパーが欲しいんじゃね
DataSetとか

599 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:37:03 ]
mapは、要素の追加または削除を行ってもそれ以外の要素の参照は保たれたままな事が保証されていますか?

600 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:38:01 ]
追記です。要素への参照の他に、キーのについても同じ事が言えますか?



601 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 22:40:26 ]
自己解決しました。ありがとうございました。

602 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:09:11 ]
死ね

603 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:43:37 ]
死ねっていう奴と
死ねって言われた奴は
死ねばいいのに

604 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 23:59:17 ]
そして伝説へ・・・

605 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 00:06:56 ]
死んでもそれ以外の人の参照は保たれたままな事が保証されていますか?

606 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:00:47 ]
死して屍拾う者なし、ってメモリリークのことですか?

607 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 08:44:19 ]
GC「骨くらいは拾っておいてやるよ」

608 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 08:45:30 ]
デストラクタ「生ける者の為の卒塔婆」

609 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:11:39 ]
std::mapのイテレータに順ずるものから、木構造の右部分木、左部分木をそれぞれ取得して
木を追跡したいんですが、そういうことは可能でしょうか?

610 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:13:10 ]
赤黒木使ってたら左部分木と右部分木だけとは限らないよ
アルゴリズムの本読んでみ



611 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:17:24 ]
>>609
std::map が木で実装されているとは限らないので、そういう操作は無い。

木の追跡(?)自体がやりたいわけじゃないと思うんだけど、結局のところ何がしたいの?

612 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:26:33 ]
>>611
upper/lower_boundで解決しました。

613 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:36:39 ]
やっぱり解決しませんでした。もういいです諦めます。STL死ね。

614 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 13:41:17 ]
お前が死ね

615 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 14:21:17 ]
すぐファビョる所を見ると朝鮮人か

616 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 14:23:03 ]
私が死ぬのであなた達は死ななくてもよいのです

617 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 15:05:12 ]
STLは生き物ではないので死ぬことはできません

618 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 15:18:03 ]
私のお墓の前で泣かないでください

619 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 15:46:50 ]
STLの考え方に頭が付いていかない所を見ると
頭が悪いかジジイかのどちらかだろう

620 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:07:29 ]
お尋ねします。
vector<vector<bool>> TempA;
vector<vector<bool>>::iterator itr1;
vector<vector<bool>>::iterator itr2;
と宣言したとします。
itr1 = TempA.begin();
itr2 = TempA.begin();
としたのち、
TempAのたとえば2行目と3行目の中身すべてを比較したいとき、
itr1++;itr2 += 2;としてiteratorを進めて、
*itr1 == *itr2の比較を一度行えばいいのでしょうか?
それとも、各行でiteratorを作成して、
各行ベクトルの列座標に対応したiteratorを回す必要がありますか?

p.s.この動作のあと、一致している行を、
itr2=Temp.erase(itr2);
みたいに削除したいのです。



621 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:34:38 ]
>>620
要するに二つのvectorを==で比較できるかってことだよな
できるよ

622 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:46:22 ]
>>621
ありがとうございます。
行に対応するvectorの各要素の比較という認識で大丈夫でしょうか。

623 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:17:13 ]
そう。要素ごとに==で比較してる

624 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:19:40 ]
>>622
23.1 Container requirements に
a == b は a.size() == b.size() && equal(a.begin(), a.end(), b.begin())
と等価と書いてある。

625 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:12:31 ]
>613
map使わずにソート済vector使えばいいんじゃね?

626 名前:620 mailto:sage [2008/06/05(木) 10:43:24 ]
>>623
亀レス申し訳ない。
ありがとうございました。

そういう情報ってどのヘッダーを見ればいいんでしょうか?
vector.hを眺めていてもさっぱりです…。

627 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:34:56 ]
>>626
ヘッダーには書いてないだろう・・・
お使いのコンパイラのリファレンスマニュアル等を読め
VCならこのへん↓
msdn.microsoft.com/en-us/library/5asks2ba(VS.80).aspx

628 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:25:16 ]
>>626
C++の規格書一回読んでみるのもいい。

629 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:20:37 ]
vectorかその内部でincludeしてるファイルに書いてあるんじゃね。実装が。

630 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:17:16 ]
イテレータを返すbegin, endが、どうして戻り値の型が違うだけで(iterator, const_iterator)オーバーロードされた関数を特定できるのかが分かりません。
自分で同じ様な事をしようとしてもSTLとは違いコンパイラが関数を特定できずに失敗します。



631 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:22:06 ]
>>630
戻り値の型じゃなくて、引数リストの後ろの const の有無が違う。

632 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:36:05 ]
>>631
それは実装側のbegin, endの定義ですよね?
自分で作ったものもconst_iteratorを返すものは引数リストの後にconstをつけているんですが、
これは利用する側が呼び出すときには特に関係ない様です。
まさか container_type::const_iterator it = ((container_type::const_iterator (container_type::*)()const)container.begin)();
なんてしなきゃいけないんですか?

633 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:24:47 ]
iteratorからconst_iteratorへの変換はできるようになってる?

634 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:27:59 ]
変換できるようにしたら const_iterator begin() const の必要性なくならないか?

635 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:31:44 ]
なんで?
constなインスタンスに対してイテレータ取得できなくなっちゃうじゃん

636 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:59:04 ]
VC7

template<class _Ty,class _Alloc>
class _Vector_iterator : public _Vector_const_iterator<_Ty, _Alloc>

637 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 19:44:07 ]
>>636
補足しとくと、iteratorは基底クラスであるconst_iteratorに変換できるといいたいだけ。
constなしbegin()の戻り値はiteratorだからconst_iteratorにも変換されうる。

begin()の戻り値を渡す先がconst_iteratorかiteratorかで、
begin()の種類(後ろにconst付きか否か)が選択されているわけじゃない。

638 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:14:29 ]
>>632
MyContainer c = ...
MyContainer const& cc = ...
MyContainer::const_iterator = c.begin();
MyContainer::const_iterator = cc.begin();

これをトレースするといいよ。

639 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:30:21 ]
なるほど、constなメンバ関数はオブジェクトがconstな時に使用されるんですね。

640 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:26:16 ]
constメンバ関数と非constメンバ関数が両方ともある場合はそうなる。
非constメンバ関数がない場合は非constオブジェクトからもconstメンバ関数が呼ばれる。



641 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:31:07 ]
\n とか \r\n とかが入った文字列を SetDlgItemTextすると
char のときはちゃんと改行してるのに string だと改行されずに何も表示されないわけですが
string って \n とかとは別に改行とかタブコードがあるんでしょうか?

642 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:40:55 ]
実際のコード貼ってみれ

643 名前:641 mailto:sage [2008/06/13(金) 21:37:36 ]
あははははは!!!!!
エディットコントロールのマルチラインがFalseなだけだった
俺市ねw

644 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:13:13 ]
641は死んだの?

645 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:49:25 ]
>>644
今日までの641は氏に、また一歩成長したプログラマーとして生まれ変わるのです。

646 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:34:34 ]
>>645が良い事言った

647 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:25:44 ]
フェニックスシングルトンなわけですね。

648 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:30:12 ]
シングルトンを真面目に考えるとややこしい事限りないなあ。

649 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:31:25 ]
非常に優秀なデザインパターンの1つだと思うな

650 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:36:29 ]
インスタンスの数が1個に限定される分、むしろ単純にならないか?



651 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:39:16 ]
Modern C++ Design を読むと
シングルトンのややこしさがよく分かる。
Scala みたいに言語的にサポートしてくれればいいんだが。

652 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:48:11 ]
作るのはいいけど削除のタイミングが面倒くさいんだよね。

653 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:53:21 ]
いつでもnewdelete出来るように改良した、って自慢げに変なシングルトン使いまくる奴ならいたな

654 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:58:26 ]
deleteしたら自動的に新しいインスタンスが作られて、
newしたら自動的に今あるインスタンスが削除されるシングルトン

655 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:51:25 ]
>言語的にサポート
使う人間のスキルへの依存度が高いC++に期待してはいけないものだよ。

656 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:59:25 ]
シングルトンて心太に似てるよね

657 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 18:36:28 ]
STLを軽く弄るためにこのスレを覗きにくるC++ビギナーはフェニックスシングルトンとModernC++Designをどうやって関連付けて考えるだろうか。

658 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 18:37:22 ]
「スレ違い」 と関連づけて考える事だろう

659 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:42:54 ]
mapはどうやってfindなどで入力されたキーが木にあるキーと同じかどうかを見るんでしょうか?
比較関数ならstd::less<T>がデフォルトで入っていてこいつを使えば良いと分かるんですか、
これと同じ様に一致関数をテンプレート引数で指定できませんか?

660 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:45:23 ]
比較関数をltとすると、
!lt(x, y) && !lt(y, x)
で一致判定してる



661 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:46:43 ]
マップのキーは、その比較関数を使って一致を判断する
!(a < b) && !(b < a) なら a と b は一致していることになる

662 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:12:24 ]
そして等価と等値の話が始まる。

663 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 22:07:44 ]
重要な概念だしな

664 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 09:53:59 ]
そしてEffective STL が売れる

665 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 10:08:08 ]
そして日本語版Modern C++ Designが叩かれる。

666 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:05:30 ]
ListとかVectorってスレッドセーフですか?
複数のスレッドからイテレータ取得してアクセスしたりするなら
シグナルやミューテクスでロックしてからアクセスするべきですか?


667 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:10:46 ]
そうですね。

668 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:16:56 ]
>>666
実装次第。
各処理系のマニュアルを読むよう。

669 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:29:14 ]
STLportでぐぐらない方が良い。

670 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:02:10 ]
スレッドセーフなのか?という問いに答える者はいなかったといふ




671 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:04:49 ]
実装次第だし。

672 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:09:48 ]
スレッドセーフではない と一律で答えておいたほうが面倒がない

673 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:24:55 ]
Camelなリストやベクタはスレチ。

674 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:43:27 ]
というか、「スレッド」の概念が標準C++にあるんだっけ?

675 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:54:49 ]
ございません

676 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:07:35 ]
スレッドの概念が無いから「スレッドセーフでない」という概念も無い。

677 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:15:17 ]
C++0xにご期待下さい

678 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 02:26:33 ]
>>670 >>531-540

679 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:08:47 ]
コンテナの範囲外にイテレータがインクメントされてしまってもコンテナを自動で拡張し、
あたかも未だに範囲内を指している様に振舞うイテレータってのがあると思うんですけど
実際はなくてただの思い過ごしだったりしますか?しなかった場合はそれが何なのか教えてください。

680 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:22:49 ]
insert_iteratorのことを言ってるのかな。



681 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:35:13 ]
自己解決もしたし意味不明な書き込みなんてみんな無視してくれるだろうと思っていたら教えてくれている人が居た。
ありがとう。

682 名前:デフォルトの名無しさん [2008/06/20(金) 15:05:13 ]
std::vector<std::string> v1;

みたいなインスタンスをシリアライズ化したいんですけど、単純に

FILE *fp = fopen("vec.bin", "wb");
fwrite(&v1, sizeof(v1), 1, fp);
fclose(fp);

みたいに書き込めば良いんですかね?
そして戻すときは、逆に

std::vector<std::string> v1;
char* buf = (char*)&v1;
FILE *fp = fopen("vec.bin", "rb");
while(fread(buf++, 1, 1, fp) > 0);
fclose(fp);

みたいな感じでいいんですかね?
STLのインスタンスのシリアライズ化で、もっと適切な方法があったら教えてください。

683 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:33:55 ]
vectorの内部にはポインタも含まれるから
オブジェクトの性質を考えてPOD型のデータまで落としこまないとダメだろう

684 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:38:38 ]
vectorの扱う型ががフリーストアを使ってないという保証があればあるいは

685 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:46:36 ]
boost::serialization使うって手も <あまり使いやすくは無い

686 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:45:27 ]
VS2005では一応下のコードは正常に動きました。
とりあえずこれが動けば十分です。

std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
fwrite(&v1, sizeof(v1), 1, fp);
fclose(fp);

std::vector<std::string> v2;
char* buf = (char*)&v2;
fopen_s(&fp, "vec.bin", "rb");
while(fread(buf++, 1, 1, fp) > 0);
fclose(fp);

687 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:53:25 ]
>>686
まてまて、それv1の確保したメモリアドレスをv2が指しているだけだろ。
終了時に2重解放でエラーになってないか?

688 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:54:48 ]
と思ったら、デストラクタで怒られました。
何がいけないんだろう・・・

689 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:58:00 ]
上の人も書いてるけどvectorは内部にポインタを持ってるんだってば。
(ついでにstringもな)
fwriteでv1を直書きすると、ポインタのアドレスが保存されるだけで、
ポイント先は保存されないんだよ。

690 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:00:54 ]
>>687,689
どうすればいいでしょうか。

やりたいことは、カンマ区切りで並んでいる大量の文字列データがあって、
それをカンマの区切りを探しつつ読み込むと非常に時間がかかるので、
初回だけカンマ区切りを解釈したら、その後はインスタンスをバイナリで一気に保存、一気に復元したいのです。



691 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:04:45 ]
vector使わずに配列を使えばいいんでしょうが、vectorのデータをシリアライズ化するということは
ニーズとしてあるはずなので、そういう手法があれば教えていただきたいのです。
ただシリアライズのためにboostという別ライブラリを使用するのは、ちょっと大げさすぎかなと。。
そこまでするなら配列でやります。

692 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:10:08 ]
自分の力量・理解度に応じた実装をするべし

693 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:11:11 ]
最低限のデータを保存したい場合はこうじゃない?

std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
const char *pstr;
fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存
for(size_t c=0, e=v1.size(); c < e; c++) {
 pstr = v1[c].c_str();
 fwrite(pstr, strlen(pstr), 1, fp);
}
fclose(fp);


694 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:21:42 ]
stringのサイズ保存してなかったので訂正
書き込み

std::vector<std::string> v1;
v1.clear();
v1.push_back("要素1");
v1.push_back("要素2");
v1.push_back("要素3");
FILE *fp;
fopen_s(&fp, "vec.bin", "wb");
fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存
size_t size;
for(size_t c=0, e=v1.size(); c < e; c++) {
 size = v1[c].size();
 fwite(&size, sizeof(size), 1, fp);
 fwrite(v1[c].c_str(), size, 1, fp);
}
fclose(fp);

695 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:28:10 ]
読み込み

std::vector<std::string> v2;
FILE *fp;
fopen_s(&fp, "vec.bin", "rb");
size_t size;
fread(&size, sizeof(size), 1, fp);
v2.resize(size);
for(size_t c=0, e=size; c < e; c++) {
 fread(&size, sizeof(size), 1, fp);
 v2[c].resize(size);
 fread(&v2[c][0], size, 1, fp);
 //stringの確保するメモリが連続してない環境なら、一度vectorなりに読み込む必要が
 //あるが、vcなら問題ないので省略
}
fclose(fp);

696 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:33:26 ]
最初にもちらっと書いたが、serialization使うとこれですむ

//保存
{
vector<string> data;
data.push_back("Hello");
data.push_back("World");

ofstream file("save.dat");
boost::archive::text_oarchive oa(file);
oa << (const vector<string>&) data;
}

// 復元
{
vector<string> data;

ifstream file("save.dat");
boost::archive::text_iarchive ia(file);
ia >> data;
}

下準備がちょっと面倒だけどな。
興味あったら下記を参照してください。
ttp://www.kmonos.net/alang/boost/classes/serialization.html

697 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:48:04 ]
>>694,695
やっぱり要素ごとにサイズと一緒に保存という形しかないんでしょうか。
私のイメージではシリアライズというと、メモリ上にあるオブジェクトの塊を
そのままバイナリで一気に書き込むという感じで、だからこそ高速化に役立つと思うのです。
要素ごとに書き込んでいると、カンマ区切りのケースとそれほど時間の差が出ないような・・・

MFCのCObjectを継承したクラスはシリアライズができますが、それはおそらく、
オブジェクトのデータやステートをメモリ空間上で一塊になるようにしている配置しているからこそ
できるんじゃないかと思います。

STLではどうもそういう仕組みはないようなので、保存や復元に時間がかかるのは無理ないんでしょうかね。。。

>>696
boostの場合はどうなんでしょうか。
保存と復元を高速化できるかどうかがキモなんです。

698 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:55:59 ]
>>690
カンマ区切りの文字列の読み込みに、そんなに時間がかかるとは思えんが。
時間がかかっているのはパースよりもvectorの伸張だろう。

先にカンマの数をカウントしてvector.reserve()するとか、vectorではなくて
dequeにするとかの方が速くなるかと。

699 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:06:48 ]
>>697
MFCのシリアライズは、各メンバをひとつずつCArchiveに書き込んでたと思うよ
CObjectを継承すれば自動的にサポートされるものでもなく、メンバをひとつずつ書き込むコードを各クラスに個別に実装する必要があった
シリアライズに対するそのイメージは誤りかと

700 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:31:32 ]
データ個数にもよるが保存と読み込み時間を短縮したいなら
まずデータ構造自体から見直すべきだろ。
というか、そこがネックになってる時点で何かが間違ってる。



701 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:44:43 ]
>>699,700
そうなんですか。
可変長データ配列のオブジェクトの保存と復元を高速化するためには、
各自が工夫して実装するしかないんですかね。
なんか車輪の再発明のような気が・・・

配列要素の変更・追加・削除は頻繁にはやらないので、そちらの時間コストは多少増えてもいいんです。
とにかくソフトの起動をコンマ1秒でも速くするために、ドカンと一気に読み込めるようにしたいんですよね。
BYTE型配列1本と、ポインタ・サイズを格納した配列の計2本で、
そういったことをやれそうなイメージはあります。

702 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:45:42 ]
vector<string>が固定長なデータじゃないので、要素ごとにアクセス
しなければならないのは仕方が無い。
また、上の例でも1文字ずつカンマをチェックしながらアクセスするよりは、
単純に数倍は速いよ。
ディスクアクセスが気になってるのなら、あらかじめメモリ上に
直列化して、総サイズも一緒に書き込むとか工夫しなさい。
(もともとfread、writeがバッファリングしてるので、あまり効果は無いだろうけど)


あとboostのも1要素ごとの読み書きです。
入れ子になってるコンテナの巡回探査がデフォで出来るってだけ。

703 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 20:42:53 ]
ほんとに直列の読み書きがしたければAPI叩くしかないんじゃないかなあ

704 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 20:59:26 ]
>>701
まぁ今回の件に限らず、「コンマ1秒でも速くする」というような目標を持っている場合、
車輪の再発明は避けられないことが多いよね(そうでない場合も勿論あるけど)。

705 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 21:01:24 ]
本当に速くしたいなら MMX とか SIMD とか使うと

706 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 21:54:44 ]
DANGOさんの出番だな

707 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 22:09:39 ]
: premature optimization is
(省略されました。続きを読むにはワッフルワッフルと書き込んでください)

708 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 01:24:43 ]
ポインタのない言語なら>>686みたいなことは当たり前にできるんだけどな。
ポインタのある言語では、一気に話が複雑になるな。

709 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 06:23:29 ]
データの入出力なんて元々複雑で時間の掛かる処理なんだから
横着するつもりなら効率の劣化には目を瞑るべき。
大体そんな困るほど遅くなることなんぞ滅多に無いし。

710 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 12:47:42 ]
だいたい直列化してないデータを直列させるからシリアライズと
いうのに、最初からメモリ上に直列に並んでると考えるのはどうなのよw



711 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 12:51:19 ]
>>708
ポインタの無いJAVAみたいな言語だって、>686みたいな記述はできても、
要素の実際の読み書きは1つずつだろ?

712 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 14:46:07 ]
>>686
これは素晴らしい!!!
すこぶる高速ですね

713 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 14:49:44 ]
>>686
これstringの実装によってはやばくないのかな

714 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:00:33 ]
>>686
こんな気持ち悪いコード見たことない

715 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:01:03 ]
>>713
そのコードがダメなのははっきりしてるから。
続きも読め

716 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:01:06 ]
それ以前の問題。

717 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:42:55 ]
ポインタ保存してポインタ復帰してるだけだからな。

718 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 16:59:18 ]
>>709
いや、プログラムの起動を可能な限り速くしたいというニーズはどこにでもある。
3秒で起動するブラウザと1秒で起動するブラウザ、どっちを使いたいかといえば速い方がいいに決まってる。

そういう場合のクラスデータのシリアライズは、1分かかるのを30秒にしたいとかいうオーダーの話ではなくて、
0.3秒かかるのを0.05秒に縮めたいとかいうオーダーなんだよ。
起動時にデシリアライズするオブジェクトの数は1つじゃないしな。

トータルで1秒以内で起動させたいとか、そういうレベルのことをやりたいとなると、
バイト配列の中に直列化したデータ(多少隙間があってもいい)をあらかじめ揃えておいて
一気にシリアライズするという考えも、アリだと思う。

719 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:02:02 ]
ファイル読み書きのオーバーヘッドなんてI/O待ちが大半なんだから、
よっぽどアホな処理でもしてない限り大差ないだろ

720 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:09:11 ]
>>718
さっきドラゴンボール全巻買ってきた までは読んだ


:そこ、高速化したいなら横着せず書かないといけないって書いてんじゃん



721 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:38:07 ]
その手のオーバーヘッドで一番時間食うのはstatだったりするんだよな

722 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:46:02 ]
>>718
将来まで不変のデータ構造ならいいけど、
少しでも変えると過去のバージョンで直列化したデータが読めなくなるよね。
(すべてのバージョンに対するコンバータを付けるのもどうかと思うし)
痛し痒しだなぁ。

723 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 18:12:43 ]
ちゅーか目的が高速化なのに質問者が面倒がって
既存の実装使おうと食い下がってるだけだじゃん。

724 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 18:28:07 ]
既存の実装で高速化できないってことは既存の実装がクソだということですよね

725 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 18:35:28 ]
F-1を公道に持っていったら全く使い物にならないのと同じ。
普通車なら速くはないが大体どこでも走れる

726 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 19:27:12 ]
>>724
べっ別にあんたのために実装したんじゃないんだからね。

すべてに効果のある実装は存在しない。自分の目的に合う実装がなければ自分で作る。

727 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 19:39:42 ]
暇だから素のテキストと長さ情報付きのバイナリで試してみた。

入力データはwindows.hおよびそこからincludeされているファイルから抽出した
全て大文字の先頭以外にアンダーバー入りの定数マクロ(WM_hoge等)18364個。
文字列の平均の長さは20.8文字。
手抜きのために、カンマ区切りではなく改行区切りで保存。

テキスト(ifstream.getline()で読み込み)
vector<string> 23ms
deque<string> 21ms
list<sting> 21ms

バイナリ(ifstream.read()で読み込み)
vector<string> 14ms
deque<string> 12ms
list<sting> 12ms

ちなみに、VC++2008Stdでコンパイル、E8400のPCで実行。
全て複数回実行した中で一番速かった結果。

728 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 19:54:00 ]
freadに変えればさらに速くなるぜ

729 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:43:18 ]
ifstreamをやめて、fopen,fgets,freadにしてみた

テキスト(fgets()で読み込み+改行コード除去)
vector<string> 14ms

バイナリ(fread()で読み込み)
vector<string> 14ms


CreateFile,ReadFileも試してみた

テキスト(2048バイトずつ読み込み)
vector<string> 11ms

バイナリ(必要なサイズだけ読み込み)
vector<string> 100ms

730 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:47:59 ]
つーかstringって時点でバッファに直読みできねーよな
CString::GetBuffer()使ってみ



731 名前:729 mailto:sage [2008/06/21(土) 23:51:07 ]
結局、ifstream.getline()が遅いだけで、読み込み部分を最適化したら
テキスト形式でもバイナリ形式でも差がない感じ。

ちなみにテキスト形式でファイル一気読みでは、稀に10msが出る程度。

あと、バイナリ形式でReadFile()でチマチマ読むのは何故か遅かった。
fread()は速いのにね。

732 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:51:41 ]
それはスレ違い。

733 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:56:05 ]
>>731
それは「何故か」でも何でもなく明らかなことだ
fread()はチマチマじゃなくて「一気に」バッファに読み込んで
読み込んだ分だけユーザに渡してるから速いんだよ

734 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:57:47 ]
>>732
スレ違いかもしれないが重要なことだろ。
stringに高速にデータを読み込む方法は存在しない。
必ずコピーが発生するのだから。

カーネルバッファ→stdioバッファ→ユーザバッファ(典型的にはchar[])→string
こんな感じ

ほらみろ、効率悪い

735 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 23:59:58 ]
stringの実装を知っていれば環境依存の方法で…
ってもうSTL作者になる以外ないな

736 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:00:38 ]
>>730
この場合だと、GetBuffer使うメリットねーと思う。

737 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:01:56 ]
>>736
いーやある。
fread()ではstringに直接読み込めないので一時的にchar[]に読み込んでコピー
するしかないが、
CString::GetBuffer()ならfreadで直接読み込める
つまり、一段コピーを減らせる

738 名前:736 mailto:sage [2008/06/22(日) 00:03:33 ]
>>737
理由は>>733が書いてる。GetBufferつかったら、それ以上に読み込み遅くなるだろ。

739 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:05:30 ]
>>738
は?何言ってんの。
CStringで適当なサイズをリザーブしといて、
GetBuffer()で取ったchar*のポインタにfread()しろっつってんだぞ?

間違いなくchar[]に読み込んでからstd::stringにコピーするより
速いよ。

740 名前:739 mailto:sage [2008/06/22(日) 00:09:03 ]
ああ、話のズレがわかった。
俺はstd::stringなんて使わなきゃ速いよつってるんだ。

最後にstd::stringにコピーしなきゃならないんなら意味ないわな、
そりゃ。
コピー君だもの。



741 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:11:10 ]
単に速いだけの話しならstd::istreambuf_iteratorとstd::ostreambuf_iterator
が速いんじゃないの?書式化なしだし

742 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:12:10 ]
>>739
いってることはりかいできるけど、俺が言いたかったのはそうじゃない。

俺が言ってるのは、読み込んだデータには
複数のデータ(複数の文字列と文字列サイズのペア)が格納されてるってことだ。
んで、>>686あたりからの流れのように、vectorに一個一個格納すると。

まあすれ違いだからもう自重する。

743 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:12:33 ]
>>741
それはどんだけ頑張ってもマクロ版のgetc()/putc()と同等の速度で、
言うまでも無くfread()より遅いよ

744 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:12:56 ]
またEffective STLを読み返さねばならんようだな

745 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 00:27:04 ]
>>743
そりゃそうだ
比べるのが無謀
というか比べるな

746 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 01:02:51 ]
std::stringのかわりにstd::vector<char>つかえばいいんじゃね

char*, const char*のかわりに使えるし
STLやboostのiterator取るタイプの関数も全部使えるし
std::stringと違ってバッファ直接書き換えできるよ

747 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 01:04:21 ]
どんだけ頑張ってもAPI直書きより
遅い。


748 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 01:10:19 ]
>>747
上に出てるように、ちまちまReadFile()を呼ぶようなアホなまねをやるぐらいなら
まだfread()のほうが速いよ

749 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 01:11:46 ]
もうRAMDisk使います

750 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 01:17:54 ]
一応言っとくけど、バッファ渡して書き換えてもらう系の
関数だのAPIだのを使う際には全てこの議論は当てはまるんだぜ
別にI/Oだけの問題じゃない

std::stringを使っている限りは常にコピーがワンクッション入ることを
覚悟せよってこった
通常はどうでもいい問題だがな



751 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 01:57:38 ]
あーつまり何だ?
ドライバ書けと

752 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 01:59:57 ]
tcpのread/writeでのコピーは減るように各OSがんばってるネー

753 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 02:07:28 ]
x86はリトルエンディアンであるというだけでtcp/ipのビッグエンディアンを
実現するのに少し不利なんだよな

754 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 02:07:52 ]
物理層じゃなくてアプリケーション層の話な

755 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 02:08:10 ]
データ本体だからendianは関係ないのでは・・

756 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 02:21:07 ]
データをストアする時にひっくり返るでしょう
ブラウザはどういう仕組みになっているのか知らないが
Unicodeをリトルエンディアンのまま画面出力できるようになっているのか、
それともビッグエンディアンに並び替えて表示しているのか

757 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 02:56:12 ]
速度最重視ならLEで送ってもらうんでないの

758 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 02:58:27 ]
OSネイティブの文字コードで送られてくることなんか超レアケースだろ。そんなところが
最適化されててもたいしたメリットは無い。

759 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 08:20:06 ]
保存したファイルを直接ファイルマッピングして、そのまま利用するのが最速なんじゃね
要するにオンメモリでの利用形式を、保存形式に合わせるw

760 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 09:06:23 ]
>>759
ファイルマッピングはファイルサイズを伸ばせないのが難点だな。何かいい方法がないものか。



761 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 09:50:40 ]
>>759
ReadFile()やWriteFile()は別にディスクをガリガリ読み書きする
わけじゃなくて、オンメモリのバッファキャッシュが相手だからな
事実上裏でOSがページ単位でファイルマッピングしてるのと同じで
CreateFileMapping()したからつって経験上別に速くならないよ
Windowsではな

話を大幅に戻すと、小手先の最適化に走る前に、本当にCSVやvector<string>
じゃなければいけないのかってところを考えるべきだと思うね

固定長データ、ISAM、SQLite、Berkeley DBのようなものが適切なんじゃないかとかさ

762 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 16:22:09 ]
fopenは、内部的にReadFileを呼び出しているものの、バッファリングしているので
(普通に使う分には)充分な速度が出る。
ただし、複数回のコピーが無駄と言えば無駄。

ReadFileは、OSのバッファにキャッシュしていてディスクアクセスはしないものの、
システムコールだから、カーネルとのスイッチが発生する。
だから、細かく何度も呼び出すと非常に遅くなる。

CreateFileMappingと使うと、OSのバッファキャッシュを経由しないので
ゼロコピーとなり、読み出しに限れば最速を期待できる。


書き込みは、普通はバッファリングされるfwriteを使うべき。
Readと同様、直接APIを叩いても大して効果ないし
逆にバッファリングを無効にすると、ディスクアクセス完了まで待たされることになる。

この場合にどうしても最速を求めるなら、非同期APIを使う。

763 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 16:52:11 ]
俺、この類はcatコマンドのソース読んで参考にした。
読み込みと、書き込み(表示)について練り込まれた結果の
知識が詰まってるなと思った。 ちなみに read() write() 使ってた。

764 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 17:36:20 ]
あ、そうだ。

stdioはバッファリングしてるけど
fgetc/fputcのような、1文字入出力系は注意。

最近のVCとかは、マルチスレッド対応ライブラリで
1文字ごとにロックしているので、このコストがバカにならない。
遅いと言われるcygwinとかもそうかもしれない。

istream_iteratorとかは知らんが、MT対応を謳っているなら
ロックしている可能性は十分ある。

765 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 19:54:16 ]
iostreamの比較なんて昔から皆やってるのになぜいまさら

766 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 19:56:02 ]
実装が進化しているかもしれん。

767 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 20:17:58 ]
残念ながらstdioより速いiostreamなんてのは見たこともないし、今後も無いだろ。
実装の質の問題というよりは、仕様上無理なんじゃないか。

ios_base::sync_with_stdio()とかあるし、デフォでシンクロしてるのが仕様だから、
stdioをバイパスできず、stdioの上に構築せざるをえないってことになる。
おまけに仕様も複雑だ。
これでstdioより速くなるわけがないんだぜ。

768 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 20:23:36 ]
_CRT_DISABLE_PERFCRIT_LOCKS

769 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 22:22:47 ]
まあ、速さだけが基準じゃつまらんよな。

770 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 22:53:16 ]
>>697
そもそも
(世にある)シリアライズ機構 = 高速化のためのもの
という発想が間違い。

シリアライズ機構 =
ヘテロなオブジェクトの集合であっても、汎用的に直列表現に置き換えるための汎用枠組み
ととらえる方が常識で、(たとえば>>699みたいに)
でも汎用では自アプリにとっては遅くて不都合!という場合に、
自アプリに特化した、汎用無視の保存方法作る、というのがさらに常識。
CSVって決まってるならCSV特化とかね。そのかわりそこ変わった瞬間に大幅変更だけど。



771 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 23:19:12 ]
はぁ?手軽に最高速がC++の売りなんじゃないですかぁ?
バカなの?

ぶっちゃけRubyのほうが100万倍マシ

772 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 23:23:20 ]
>>771
はいはい、そうですね

773 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 23:27:47 ]
C++が手軽なんて話は始めて聞いた

774 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 02:08:48 ]
最初に「100万倍」ってとこだけ目に入って、
あーきっとアホの子なんだろうなーと思って残りを見たら
完全にその通りだった。

775 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 03:37:07 ]
Ruby信者が例外なく全員キモイのは何故なんだろう

776 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 07:43:16 ]
Rubyは優秀な言語なのに、使ってる人の中身がDQNだからもったいないよなw

777 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 08:06:04 ]
釣りだったことにして逃げ切りを図るレスが来る頃合いだけど、
それを先にこうして予測したことで、ちょっとルートが変わるかもしれないな。

778 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 10:59:25 ]
いつも思うんだが信者がわざわざRubyの評判を落とすような事をするかな。

779 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 11:23:27 ]
儲に見えないのは俺だけか

780 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 11:55:36 ]
>>771-778は全て自演



781 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 13:00:25 ]
ということにしたいんですね

782 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 14:35:23 ]
>>778
例えば宗教団体の信者は熱心に勧誘を行って、結果周りから見るとイメージダウンをしている。
似たようなもんでは

783 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:29:52 ]
そうかそうか

784 名前:デフォルトの名無しさん [2008/06/24(火) 20:00:11 ]
vectorの要素を指すポインタは無効になることがあります。
では、queueの要素を指すポインタは無効になることがありますか?
下のプログラムを実行すると、1 2 4 4 5 6 と出力され、期待通りに動きました。
このプログラムは正しいプログラムですか?

#include <iostream>
#include <queue>
using namespace std;

int main()
{
  queue<int> q;
  q.push(1);
  q.push(2);
  q.push(3);  int* x = &q.back();
  q.push(4);
  q.push(5);
  q.push(6);
  (*x)++;

  while (!q.empty()) {
    cout << q.front() << ' ';
    q.pop();
  }
  return 0;
}


785 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 20:11:36 ]
>>784
queueの中身のデフォはdequeなので、要素追加で
リアロケートが発生することがある。ポインタもイテレータも無効になる。



786 名前:784 mailto:sage [2008/06/24(火) 21:00:22 ]
>>785
なるほど。ありがとうございます。危ないところでした。

では、リストを使って、queue<int, list<int> > q;
とすればOKでしょうか?

787 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 21:30:01 ]
>>785
途中への追加はイテレータ等が無効になる可能性があるけど
端への追加ではイテレータ等は無効になんないんじゃないの?

788 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 21:46:06 ]
>>787
> 23.2.1.3 deque modifiers
> An insert at either end of the deque invalidates all the iterators to the deque,
> but has no effect on the validity of references to elements of the deque.

イテレータは無効になるが、要素への参照は有効のまま。

789 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 09:16:26 ]
>>786
vectorやdequeなら、イテレータではなく添え字でアクセスするのも有り。

790 名前:デフォルトの名無しさん [2008/06/28(土) 14:03:55 ]
algorithmのcopyについての質問です。

ifstream ifs(argv[1]);
vector<char> file;
copy(
 istream_iterator<char>(ifs.seekg(10, ios_base::beg))
 istream_iterator<char>(ifs.seekg(20, ios_base::beg))
 back_inserter(file)
);

上記のようなコードで、あるファイルの10バイト目から20バイト目までをコピーしようとおもったのですが、出来ませんでした。
このような事をする場合はどうしたらいいのでしょうか?



791 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 15:14:14 ]
>>790
int const begin = 10;
int const end = 20;

ifs.seekg(begin);
int const length = end - begin;
file.resize(length);
ifs.read(&file[0], length);

792 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 15:21:29 ]
>>791
ありがとう、だけどファイル以外のストリームに対しても同じ方法がとりたいとおもっているので、
algorithmのcopy、あるいはSTLの何かを使って解決したいのです。
で、思いついたのが790のコードなのです。

793 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 17:36:54 ]
>>792
>791 はファイル以外のストリームにも使えるんじゃないか?
seekg() ができないかもしれないってこと?

794 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 17:41:54 ]
そういや copy_n() ほしいな。

795 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 20:43:54 ]
どうでもいいけどistream_iterator<char>使うな
istreambuf_iterator<char>使え

istream_iterator<char>はoperator>>で入力するから、空白とか
スキップする。コピーにならんぞ

796 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 20:57:41 ]
どうでもいい割には念を押すね。

797 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:09:48 ]
>>795
それ「どうでもいい」事じゃないと思うw

798 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:25:50 ]
あげあしはどうでもいいよ。

799 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:24:58 ]
揚げ足取り、って言いたかったのかな。

800 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:30:10 ]
手羽先、って言いたかったんたと思うよ



801 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:44:47 ]
コケコッコーーー!!!

802 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 08:15:27 ]
お前ら鳥類食ってて何も恥じらいはないのかよ。
哺乳類としてのプライドはどこへ

803 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 08:54:17 ]
意味不明

804 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 09:01:33 ]
つーか、ヘビとかトカゲとか、哺乳類を食うのは許せないよな。
やつら爬虫類が生まれた頃にはまだ哺乳類も鳥類も居なかったってのに。
赤外線センサーまでつけやがって。

805 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 16:22:47 ]
面白いと思って書いてるのかな

806 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 18:24:07 ]
鳥類爬虫類は許せるが
鯨だけは愛と権利が与えられるべきだと思います


STL

807 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 18:27:03 ]
何故か日本より沢山偶然鯨が掛かる隣の国には抗議しません


808 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:09:10 ]
何でこんな流れに

809 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 21:42:20 ]
みんな鳥類食ってて何も恥じらいもないからだと思う

810 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 21:49:13 ]
牛食うのは禁止すべきだろ。



811 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:20:25 ]
人食いてぇ

812 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 02:02:12 ]
通報しますた

813 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 02:11:21 ]
考え方を変えるんだ
そこにシニカルなアーティクルか精神的原論を見出せるかどうかを試してから通報すべきだ
日本は民主主義社会だっていってたよ確か誰かが
毎日と朝日の新聞見ながら泡噴きながら

人食いてぇ=女の子監禁してぇ
人(で)食いてぇ=女の子換金してぇ
人=幼女
人=稚児
人=人

通報しますた

814 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 07:41:04 ]
お前らSTLの話しろよ。
鳥類とか哺乳類とか人間とかあんまり関係ないだろ。

815 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 09:19:26 ]
>>813
通報されないように気を付けて。

ところで、map<int,bar*> mに挿入する時、
m.insert(map<int,foo*>::value_type(0, new foo))とか
m[0]=new fooとか
するのはヤバいよね。
スマポ使えない状況でどう書くのが一番スマートですか?

816 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 10:17:56 ]
foo* p = new foo;

try
{
 m.insert(map<int,foo*>::value_type(0, p));
 // m[0] = p;
}
catch(...)
{
 delete p;
 throw;
}

817 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 10:19:22 ]
まずmap<int,bar*>のbar*を、直接 opertaor =(bar *ptr) 出来ないようなクラスに置き換える。
・map<int, test<bar> >

後はしらね。勝手に適当にメソッドでnewが隠蔽されるようなものでも書けば良いと思うよ。

818 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 11:20:34 ]
>>812
たった今>>811に食われたじゃないか


819 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 11:56:46 ]
foo* p = new foo();
if (!map.insert(std::make_pair(0, p)).second) {
 delete p;
 p = 0;
}

820 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:03:46 ]
p = repinterpret_cast<void*>(0);



821 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:18:09 ]
>>819
insertで例外起きたらメモリリークするでよ

822 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 13:35:58 ]
>>816
それだと m[0] に既存のポインタが入っていた場合にリークする。
↓これでいいかな?

foo* p = new foo;
try
{
&nbps; foo*& in = m[n];
&nbps; delete in;
&nbps; in = p;
}
catch (...)
{
&nbps; delete p;
&nbps; throw;
}

「スマポ使えない」と言ってもさすがに auto_ptr は使えるだろうから、
↓こっちのがいいと思う。

std::auto_ptr<foo> p(new foo);
foo*& in = m[n];
delete in;
in = p.release();

823 名前:822 mailto:sage [2008/07/02(水) 13:37:02 ]
うわ。 nbsp ミスった。最初のコード訂正。

foo* p = new foo;
try
{
  foo*& in = m[n];
  delete in;
  in = p;
}
catch (...)
{
  delete p;
  throw;
}

824 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:34:55 ]
foo * p = new foo;
try {
std::swap(p, m[0]);
delete p;
}
catch(...) {
delete p;
throw;
}

825 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:52:19 ]
関数内クラスでauto_ptrもどきを自作すればいいんじゃね?

簡単に
pair<map<int,bar*>::iterator, bool> ib(map.insert(std::make_pair(0, 0)));
if (ib.second)
  ib.first.second = new foo;
でも良い気がするけど。

826 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 23:35:18 ]
こんばんは。g++でtr1::unordered_setを使おうと思ったのですが。
tr1::unordered_set< vector<unsigned char> >とすると
‘struct std::tr1::hash<std::vector<unsigned char, std::allocator<unsigned char> > >’
と怒られてしまいます。これは何が悪いのでしょうか?
(vector用のhash関数を自分で作る必要があるということでしょうか?)

827 名前:デフォルトの名無しさん [2008/07/05(土) 23:41:48 ]
すいませんage忘れました。

828 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 03:22:08 ]
>>826
コードとエラーメッセージをちゃんと貼れ。

829 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 04:21:23 ]
デバッガとかでさ、変数名長すぎでしょ。
もう嫌だ。

830 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 17:51:42 ]
#include <iostream>
#include <vector>
using namespace std;

class A {
int val;
public:
A(){cout<<"new"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ val = x; }
int getval(void){ return val; }
};

int main () {
A a;
vector<A> list;
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i ) {
a.setval( i );
list.push_back( a );
}
cout <<"------------------------------------ Line2"<< endl;
//cout << "size:\t\t" << list.size() << endl;
//cout << "list[data,3]:\t" << list[data, 3] << endl;
for ( unsigned int i=0; i<list.size(); ++i ) {
cout<< list[a,i].getval() << endl;
}
cout <<"------------------------------------ Line3"<< endl;
list.clear();
cout <<"------------------------------------ Line4"<< endl;
return 0;
}



831 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 17:54:23 ]
Line1とLine2の間の
push_backのリサイズ時では何が起こっているのでしょうか

832 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 18:14:06 ]
capacityが要素を保持するのに足りなければ、メモリの再確保が起きている。

833 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 18:46:38 ]
ということは、一度破棄していると言うことでしょうか

834 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:57:59 ]
そのクラスAにコピーコンストラクタも書いてみ

835 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 20:48:24 ]
A(const A &obj){cout<<"copy"<<endl;} と
push_back後に1loopの目安として新しく
cout<<"----------------------------------"<<endl;
を付け足して走らせてみたところ

Line1とLine2の間の"copy"と"delete"の表示が
copy がpushした回数+1
deleteがpushした回数
になりました。

copyの回数が+1なのが気になります。
入れる側の参照+listに入っている数と考えそうになりましたが
これでサイズを比べて足りないようなら再確保…と考えるのは変よですね
copyとdeleteの順番と回数を考えると
前のvectorから入っている分コピーした回数+付け足す側からコピーの一回分
という事でしょうか

836 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 20:58:59 ]
あれ、ちょっと変ですね…3回目のプッシュで考えると
既にpushされているのが2個なので

copy  ←コピーしようとした
ここでサイズが足りないので再確保
copy  ←コピーしようとした
copy  ←前のvectorからコピー
copy  ←前のvectorからコピー
delete ←入れようとした時のテンポラリの破棄?
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
でしょうか、なんだか混乱してきました…。

837 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:23:27 ]
ここでサイズが足りないので再確保
copy  ←前のvectorからコピー
copy  ←前のvectorからコピー
copy  ←前のvectorからコピー
copy  ←新しい要素のコピー
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄
delete ←前のvectorに入ってるのを破棄

だろ。まぁ新しい要素をどこでコピーするかは実装依存だろうが。
valの値も表示させれば分かるべ。

838 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:43:28 ]
それが4回目のpush_backなら納得できるのですが
3回目のpush_backでcopyが4つ表示されているので混乱しています。

839 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:49:50 ]
iが3だから3回目とか勘違いしてないか?

840 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:54:59 ]

copy
copy
delete
-----------0
copy
copy
copy
delete
delete
delete
-----------1
copy
copy
copy
copy
delete
delete
delete
-----------2

こう表示されています
環境は VC++2005EE +SDK win2000 です



841 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 21:56:29 ]
class A {
int val;
public:
A(){val=0,cout<<"new"<<endl;}
A(const A &obj){cout<<"copy"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ this->val = x; }
int getval(void){ return val; }
};


cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i )
{
a.setval( i );
list.push_back( a );
cout<<"----------------------------------"<< i <<endl;
}
cout <<"------------------------------------ Line2"<< endl;


ソースはこうなってます

842 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:03:30 ]
copy
----------------------------------0
copy
copy
delete
----------------------------------1
copy
copy
copy
delete
delete
----------------------------------2

うちではこうなった。
VC++2008EE

forループ入る前にvectorになんか入れてない?
size()の値表示させてみ。

843 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:06:00 ]
これが全文です。
#include <iostream>
#include <vector>
using namespace std;
class A {
int val;
public:
A(){val=0,cout<<"new"<<endl;}
A(const A &obj){cout<<"copy"<<endl;}
~A(){cout<<"delete"<<endl;}
void setval(int x){ this->val = x; }
int getval(void){ return val; }
};

int main (){
A a;
vector<A> list;
cout <<"------------------------------------ Line1"<< endl;
for ( int i=0; i<5; ++i ){
a.setval( i );
list.push_back( a );
cout<<"----------------------------------"<< i <<endl;
}
cout <<"------------------------------------ Line2"<< endl;
for ( unsigned int i=0; i<list.size(); ++i ) {
cout<< list[a,i].getval() << endl;
}
cout <<"------------------------------------ Line3"<< endl;
list.clear();
cout <<"------------------------------------ Line4"<< endl;
return 0;
}

844 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:36:38 ]
2005入れてないから2003でやってみたらそうなった。
ソース追ってみると、追加する要素を一旦ローカル変数にコピーしてた。
その変数のコピーと破棄が1回ずつ多いみたい。
2005のソースはわからんが多分同じ理由だろう。

845 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 22:41:38 ]
なるほど、これで胸のつかえが取れました
付き合ってくれた皆さん、本当にありがとうございました。

846 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 23:04:39 ]
>>844
>追加する要素を一旦ローカル変数にコピーしてた。

list.push_back( list[3] );






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<192KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef