【C++】STL(Standard Template Library)相談室 9at TECH
【C++】STL(Standard Template Library)相談室 9 - 暇つぶし2ch1:デフォルトの名無しさん
08/02/27 02:03:30
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 8
スレリンク(tech板)

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

2:デフォルトの名無しさん
08/02/27 02:05:01
【C++】STL(Standard Template Library)相談室 7
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 6
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 5
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 ;4
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 3
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室 2
スレリンク(tech板)
【C++】STL(Standard Template Library)相談室
スレリンク(tech板)

3:デフォルトの名無しさん
08/02/27 02:05:31
入門ページなど

・入門
URLリンク(www.jah.ne.jp)
・入門,一覧,使い方
URLリンク(www5c.biglobe.ne.jp)
・メソッド一覧
URLリンク(www.wakhok.ac.jp)
・サンプルプログラム集
URLリンク(www.s34.co.jp)
・TIPS集
URLリンク(www.nantekotta.com)
・メルマガ
URLリンク(www.kab-studio.biz)
・解説
URLリンク(ja.wikipedia.org)
URLリンク(www-ise2.ise.eng.osaka-u.ac.jp)

マルチスレッドプログラミングの時には
URLリンク(www.logos.ic.i.u-tokyo.ac.jp)

STLPort
URLリンク(www.sgi.com)
URLリンク(www.stlport.org)

4:デフォルトの名無しさん
08/02/27 02:05:53
書籍紹介


STL標準講座―標準テンプレートライブラリを利用したC++プログラミング
URLリンク(www.amazon.co.jp)

STL―標準テンプレートライブラリによるC++プログラミング 第2版
URLリンク(www.amazon.co.jp)

標準C++:STLの基礎知識
URLリンク(www.amazon.co.jp)

標準講座C++―基礎からSTLを利用したプログラミングまで
URLリンク(www.amazon.co.jp)

STLによるコンポーネントデザイン
URLリンク(www.amazon.co.jp)

Effective STL―STLを効果的に使いこなす50の鉄則
URLリンク(www.amazon.co.jp)


5:デフォルトの名無しさん
08/02/27 02:07:07
関連スレ

C++相談室 part60
スレリンク(tech板)

Boostを語れゴラァ part5
スレリンク(tech板)

C++0x 2
スレリンク(tech板)

C++0x Part2
スレリンク(tech板)

6:デフォルトの名無しさん
08/02/27 02:07:36
template class< >>1 >乙

7:デフォルトの名無しさん
08/02/27 09:50:04
てすと

8:デフォルトの名無しさん
08/02/27 10:31:03
#include ">>6"
乙< >>1 > >>1乙;

9:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/27 19:30:39
for (auto i: v)
にはならないのか

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

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



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

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

16:デフォルトの名無しさん
08/02/27 22:23:48
URLリンク(www.research.att.com)

17:デフォルトの名無しさん
08/02/27 22:35:09
SchemeはC++で実装されてるんですよ

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

19:デフォルトの名無しさん
08/02/27 22:42:06
まだドラフトには入ってないけど
検討されてはいたはず。

20:デフォルトの名無しさん
08/02/27 22:58:43
perlから帰ってくると

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

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

21:デフォルトの名無しさん
08/02/27 23:19:46
>>17
C++コンパイラはLispで実装されてるんですよ

22:デフォルトの名無しさん
08/02/27 23:22:26
LispはSchemeで実装されてるんですよ

23:デフォルトの名無しさん
08/02/27 23:27:40
URLリンク(www.open-std.org)
URLリンク(www.open-std.org)

によれば

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

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

25:デフォルトの名無しさん
08/02/28 00:42:49
>>23

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


26:デフォルトの名無しさん
08/02/28 11:24:33
LoadFromFile/Save~、
LoadFromStream/Save~、
みたいな入出力は、
STLではどうなっていますか?


27:デフォルトの名無しさん
08/02/28 11:25:45
>>26 fstream, istream, ostream とか

28:26
08/02/28 11:35:28
さんks

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

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

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

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

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

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

33:デフォルトの名無しさん
08/02/28 12:54:51
STLはメモリプールですが?

34:デフォルトの名無しさん
08/02/28 12:58:18
>>33
コンテナだろ?そりゃそうだ。

35:デフォルトの名無しさん
08/02/28 13:00:23
STLを使って、
LoadFromFile/Save~、
LoadFromStream/Save~、
がある、
メモリプールの実装教えれ!

36:デフォルトの名無しさん
08/02/28 13:02:11
>>35
ぶん ぶん ぶん ハチが飛ぶ

37:デフォルトの名無しさん
08/02/28 13:11:28
>>35
ありません。さようなら。

38:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/28 13:18:52
やってみたらわかるんでない?

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

41:デフォルトの名無しさん
08/02/28 13:22:41
istreambuf_iteratorで検索したら分かりますた。

URLリンク(ml.tietew.jp)

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

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

42:41
08/02/28 13:24:42
それと、stringによるLoadだとテキストファイル対象のようですが、
バイナリファイルだとどうなりますか?

43:デフォルトの名無しさん
08/02/28 13:39:26
vector

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

45:デフォルトの名無しさん
08/02/28 13:52:12
>>44
>ostreambuf_iterator
の使い方サンks。

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

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

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

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

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

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

イテレーターって難い。


49:デフォルトの名無しさん
08/02/28 14:00:01
thx>>47
>ストリームバッファクラス

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

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

51:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/28 14:52:45
>>51
ファイルのオープンに成功したかどうかは
チェックせんの?

53:デフォルトの名無しさん
08/02/28 15:02:08
伸びてると思ったらまた宿題の続きかよ

54:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/28 15:10:29
少しはマニュアル読め
コード読んでるこっちが恥ずかしくなるわ

57:デフォルトの名無しさん
08/02/28 15:10:42
if(!fs)

でいいだろ

58:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/28 15:30:28
やっぱ、バイナリの場合、書き方分かりません。

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

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

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


61:59
08/02/28 15:48:05
あ、そうではなくて、既に存在しているvectorにロードしたい場合は、ですが。

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

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

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

64:59
08/02/28 16:05:38
>>62
ふいんきでヴぁれました?

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

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

65:デフォルトの名無しさん
08/02/28 16:11:15
この内容って関係してますか?
URLリンク(etwas.wolfish.org)

66:デフォルトの名無しさん
08/02/28 16:58:38
チャットじゃないんだから少し頭ん中整理してから投下してくれ

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

68:デフォルトの名無しさん
08/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
08/02/28 17:06:08
>>67
自分もそう思ったが、よくよく見ると違った。ていうか、あっちの方がラベルが高くて難しい単語が出てくるおw

70:デフォルトの名無しさん
08/02/28 17:12:44
鼻血ブーーーーーーーーーーーーーーーーーーー
うんこブリブリブリーーーーーーーーーーーーー

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

72:デフォルトの名無しさん
08/02/28 18:19:14
イミフメ>>71


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

についてkwskキボンorz

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

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

75:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/28 18:34:38
ゴメンなさい、
> (int (*)(int))std::toupper
に直してませんですたorz

77:デフォルトの名無しさん
08/02/28 20:57:33
マクロの場合があるからと違うんか

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

79:デフォルトの名無しさん
08/02/28 23:29:51
関数オブジェクトを使うべき

80:デフォルトの名無しさん
08/02/29 05:46:31
typedef std::map<char, void*> MyMAP //void* にはMyMAPのポインタが入る

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

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

82:デフォルトの名無しさん
08/02/29 10:15:18
今、軽く衝撃を受けたわ

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

84:デフォルトの名無しさん
08/02/29 10:42:27
>>83
できない理由が無ければできるもんだよ。

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

86:デフォルトの名無しさん
08/02/29 11:14:36
>>85
いいえ。コンテナだけがSTLではありません。

87:デフォルトの名無しさん
08/02/29 11:17:57
え”?

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

88:デフォルトの名無しさん
08/02/29 11:23:47
つ[<algorithm>, <numeric>, ...]

89:デフォルトの名無しさん
08/02/29 11:25:34
>[<algorithm>, <numeric>, ...]

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

90:デフォルトの名無しさん
08/02/29 11:45:02
なぜ何でもカテゴライズしたがるんだか

91:デフォルトの名無しさん
08/02/29 11:51:26
>>89
インクルードファイルalgorithmやnumericで定義されている関数

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

92:デフォルトの名無しさん
08/02/29 12:09:35
テンプレートだけに型に(ry

93:デフォルトの名無しさん
08/02/29 12:52:10
boost::type_traits早く標準化汁

94:デフォルトの名無しさん
08/02/29 15:59:45
標準アルゴリズムって言葉使わないか?

95:デフォルトの名無しさん
08/02/29 17:22:11
いやまて朝鮮人かもしれんぞ
ことによると中国人かも

96:デフォルトの名無しさん
08/02/29 17:56:00
>>90
神の教えだからだろ

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

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

99:デフォルトの名無しさん
08/03/01 13:02:13
Win32APIが使えるなら一発

100:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/03 18:54:54
が、特殊ケースを想定するとそれだけでは済まないので、
ちまちま書くよりc_strでランタイムやAPIの既存のルーチンに任せるのが定番。

102:デフォルトの名無しさん
08/03/03 18:57:59
だよなぁ。hoge\2007.11.10\bar とか。

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

SBuf = resultBuf;

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

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

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


105:デフォルトの名無しさん
08/03/06 15:15:26
>>103
SBuf = &resultBuf[0];

106:103
08/03/06 15:20:33
>>105
有難うございます。コンパイル通りました。


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

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

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

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

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

111:103
08/03/06 15:42:13
NULL入りの場合、無しの場合、両方分かりました。
ありがとうございましたorz

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

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


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

114:デフォルトの名無しさん
08/03/06 16:27:45
>>105だとresultBufが空のときにまずいような気がする

115:デフォルトの名無しさん
08/03/06 16:31:54
null終端なら空ってことはありえない

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

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

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

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

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

118:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/06 16:53:25
>>118
言い訳はいいからお前には仕事はやらん。

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

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

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

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

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

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

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

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

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

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

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

129:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/06 17:18:24
んでその流儀に従って何度も煮え湯を飲まされるわけ?
なんかバカらしいぞそれ。

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


131:デフォルトの名無しさん
08/03/06 17:19:54
まったく、ひどい論点のすり替えだぜ。

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

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

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

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

136:デフォルトの名無しさん
08/03/06 17:35:32
未経験高卒ですがC++で仕事したいです

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

138:デフォルトの名無しさん
08/03/06 17:50:14
>>137
全く持って同意

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


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

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

141:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/06 18:05:16
赤福の賞味期限偽装に近い問題やね

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

143:108
08/03/06 18:06:14
resultBufがstringだと勘違いしてた

144:デフォルトの名無しさん
08/03/06 18:19:31
今更だなw
だが正直でよろしい

145:デフォルトの名無しさん
08/03/06 18:49:07
>>116はどう見ても釣り。


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

147:デフォルトの名無しさん
08/03/06 19:25:38
>>146
このスレではどうでもいいことだけどな。

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

149:デフォルトの名無しさん
08/03/06 21:03:52
確かに、そういう人には仕事任せたくないなw

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

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

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

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

154:デフォルトの名無しさん
08/03/06 21:19:05
残念ながら data も同じ。

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

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

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

158:デフォルトの名無しさん
08/03/06 21:28:14
いざとなったら得意のundefined behaviorでいいだろ。

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

160:デフォルトの名無しさん
08/03/07 04:52:01
それは無意味にkskしろってことかい

161:デフォルトの名無しさん
08/03/07 09:34:55
string::swap について教えて下さい。

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

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

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

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

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

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

163:161
08/03/07 10:29:50
サンクス。

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

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

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

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

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

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

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

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

165:161
08/03/07 10:40:31
ラジャ!

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

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

166:デフォルトの名無しさん
08/03/07 10:58:42
>>165
deep copyをするとno throwの保障ができなくなる。

167:161
08/03/07 11:00:02
すみません、教えてクンですみませんが、最後に記述を教えて下さいorz

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

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

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

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

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

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

>vector同士ならできる。

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

170:デフォルトの名無しさん
08/03/07 11:19:32
テンプレートパラメータが違うとダメだろう

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

172:161
08/03/07 11:36:47
全部分かりました。有難うございましたorz


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

173:デフォルトの名無しさん
08/03/07 13:11:25
質問です。

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

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

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

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

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

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

177:173
08/03/07 13:37:33
何だ、そうでしたか。無駄に2つ作ってしまったorz

178:173
08/03/07 13:42:12
頭が混乱してましたが、

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

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

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

179:デフォルトの名無しさん
08/03/07 13:44:52
>>178
わけがわからん。何がしたいのか書きなおしてくれ。

180:173
08/03/07 13:48:53
ごめんなさい、テストプログラム書いたら違っていました。

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

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

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

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

182:173
08/03/07 13:53:05
あ、「「string &」だとウォーニングだったのが、「string const &」だとウォーニング消えました。

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

183:173
08/03/07 13:54:45
>俺だったら初めと終わりのイテレータを引数に取るようにする。

はつみみです。

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

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

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

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

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


188:デフォルトの名無しさん
08/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
08/03/07 16:49:34
>>188
はじめそれに近い形で書いてたんですが(違いはstring側はconstにしてなかったとこだけ)、
メソッド宣言2行になると、以外にクラス部品作るのがしんどくて。
効率悪くても1つにしたいな、と思いました。

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

190:デフォルトの名無しさん
08/03/07 16:50:09

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

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

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

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

193:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/08 20:53:45
>>193
とりあえずg++だとエラーになった

195:デフォルトの名無しさん
08/03/08 20:59:06
ふぁっきんBCC

196:デフォルトの名無しさん
08/03/08 21:03:38
>>193
C++2003 に準拠しているならそれでも規格の範囲内。
変更できないことが明記されるのは次の C++0x から。
URLリンク(www.open-std.org)

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

197:デフォルトの名無しさん
08/03/08 21:04:28
>>193
Effective STL 第22項をどうぞ。

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

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

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

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

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

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

202:デフォルトの名無しさん
08/03/10 08:50:55
いろいろ。

じゃ、直しておきまつ。

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

204:デフォルトの名無しさん
08/03/11 09:05:07
>イテレータにstd::copy

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

205:デフォルトの名無しさん
08/03/11 15:29:40
いや、イテレータを引数に取れる関数だろ

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

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

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

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

209:デフォルトの名無しさん
08/03/11 21:05:59
ロケールの設定とか?

210:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/11 21:31:17
間違えました。
フルパス名をコピペして、\を一つ減らしてエクスプローラーに貼り付けると正常に開けます。

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


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

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

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

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

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

216:デフォルトの名無しさん
08/03/12 07:50:53
>>214
もすこし具体的にどうぞ。

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

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

218:デフォルトの名無しさん
08/03/12 07:53:22
>>217
それは別問題

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

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

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

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

223:デフォルトの名無しさん
08/03/12 08:07:42
>>214
要素は引っ越しません。

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

225:デフォルトの名無しさん
08/03/12 08:49:23
>>223
嘘をつくな

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

227:217
08/03/12 09:01:52
I got it.

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

228:217
08/03/12 09:02:25
memset、memcpyだった。

229:デフォルトの名無しさん
08/03/12 09:03:13
怖いじゃなくて、memsetだとプログラム落ちるだろ、jk

230:デフォルトの名無しさん
08/03/12 09:05:39
そういうのはCのノリが抜け切れてない年寄りが多いの?

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

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

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

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

232:217
08/03/12 09:22:43
URLリンク(sunlight.cocolog-nifty.com)

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

スレ違いでゴメン!

233:デフォルトの名無しさん
08/03/12 09:28:30
突っ込みたいなら突っ込んであげればいいのに

234:デフォルトの名無しさん
08/03/12 10:05:25
>>232
君がインストラクタになってあげなさい

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

236:デフォルトの名無しさん
08/03/12 12:49:21
>>235
引越しは後片付けしてから出て行くよ。

237:217
08/03/12 15:43:34
自分は暗黙のインストラクタでいいのでw

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

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

239:デフォルトの名無しさん
08/03/12 21:28:37
コピコンでは普通は deep copy する。
そういうもの。

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

241:デフォルトの名無しさん
08/03/12 23:00:16
それは特殊例

242:デフォルトの名無しさん
08/03/14 00:11:29
インストラクタwww

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

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

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

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

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

244:デフォルトの名無しさん
08/03/14 01:08:07
allocatorを指定するとか。

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

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

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

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

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

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

250:デフォルトの名無しさん
08/03/14 10:11:23
>>249
ああ、たしかにPODだとそうだね。

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

251:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/14 12:23:37
わかってない子が来た

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

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

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


254:デフォルトの名無しさん
08/03/14 13:22:12
>>232のアホ顔軍曹に習ってくる様にw

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


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

257:デフォルトの名無しさん
08/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
08/03/14 19:12:24
すみません、早速自己解決しました。
単純にPlattformSDKのcrtにあるxtreeが読まれていたからでした
お騒がせしました。
...OSまで再セットアップしたのにorz

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

260:デフォルトの名無しさん
08/03/14 20:16:40
func

261:デフォルトの名無しさん
08/03/14 20:18:10
lambda

262:デフォルトの名無しさん
08/03/14 20:22:36
fuck

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

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

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

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

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

266:デフォルトの名無しさん
08/03/15 21:04:14
はーやく来い来いC++0x

267:デフォルトの名無しさん
08/03/15 22:12:04
>>259

by

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

269:デフォルトの名無しさん
08/03/18 01:41:05
マ板で聞いてこいやボケが

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

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

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

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

274:デフォルトの名無しさん
08/03/18 02:11:44
MFCオンリーなんて人もいるんじゃね?

275:デフォルトの名無しさん
08/03/18 02:16:14
なるほど。

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

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

277:デフォルトの名無しさん
08/03/18 03:55:52
STLのアルゴリズムは必ずしも最適解ではないからなぁ

278:デフォルトの名無しさん
08/03/18 04:54:27
>>268
2000人もいないだろ

279:デフォルトの名無しさん
08/03/18 05:10:49
わがまま言ってんじゃねえ
マ板に行け

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

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

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

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

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

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

285:デフォルトの名無しさん
08/03/18 10:46:29
つまり、今の組み込みの分野。

C++はじまた。

M$/V$オワタw

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

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

288:デフォルトの名無しさん
08/03/18 23:14:02
言語に特化した知識だけじゃたかが知れてる。

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

289:デフォルトの名無しさん
08/03/18 23:14:44
ダメな子ほどかわいい(ぼそ

290:デフォルトの名無しさん
08/03/18 23:19:20
STL、Boostがあるからなんとか付き合っていけるんです。。。

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

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

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

294:デフォルトの名無しさん
08/03/19 03:27:01
テンプレートが絡むとソースが美しくないんだよなぁ、なんか。

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

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

297:デフォルトの名無しさん
08/03/19 09:42:06
template typedefが欲しい

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

299:デフォルトの名無しさん
08/03/19 10:20:21
>>295
コイツは。。

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

301:デフォルトの名無しさん
08/03/19 15:45:27
なんで?

302:デフォルトの名無しさん
08/03/19 15:50:05
多分MFCの話じゃね?それならそのとおり。

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

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

304:デフォルトの名無しさん
08/03/19 17:28:32
まるで自分はできるとでも言ってるかのよう

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

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

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

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

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

310:デフォルトの名無しさん
08/03/19 18:10:51
イテレータンが無いとSTLの話できない椰子らw

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

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

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

314:デフォルトの名無しさん
08/03/19 18:19:51
STLでなくても、1年あれば何だって忘れる。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

329:デフォルトの名無しさん
08/03/19 21:56:08
勉強になっていいじゃん >327

330:デフォルトの名無しさん
08/03/19 22:12:25
まあ勉強会としてはありかもしれない,、。

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

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

333:デフォルトの名無しさん
08/03/20 05:25:05
ローカルな話題を堂々と振られるのもあれだな

334:デフォルトの名無しさん
08/03/20 05:30:12
「使う」話は遍くローカルだよ。

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

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

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

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

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

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

339:デフォルトの名無しさん
08/03/20 06:41:18
あ、すまんもう一つレスが入ったか。

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

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

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

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

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

341:デフォルトの名無しさん
08/03/20 07:20:39
リンクミス >>332 の場合

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

343:340
08/03/20 07:41:09
>>342
俺も突っ込んでる一人なんだが…w

344:デフォルトの名無しさん
08/03/20 07:47:11
>>343
見ればわかるけど・・・。

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

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

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

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

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

350:デフォルトの名無しさん
08/03/20 09:34:19
>>348
エラーメッセージは見るな
自分のソースを見ろ


351:デフォルトの名無しさん
08/03/20 09:35:11
C++ Templateにも追い方が少し書いてあったと思う

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


353:デフォルトの名無しさん
08/03/20 09:46:10
言語に関らずそうだよ

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

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

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

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

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

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

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

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

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

360:デフォルトの名無しさん
08/03/20 14:02:01
さてconceptはまだですか?

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

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

362:デフォルトの名無しさん
08/03/20 20:53:02
>>361 は標準ライブラリを盲信、過信していると思う。

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

364:デフォルトの名無しさん
08/03/20 20:55:03
そういうのを盲信って言うんだよw

365:デフォルトの名無しさん
08/03/20 21:07:18
見事に釣られてしまったようです。

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

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

367:デフォルトの名無しさん
08/03/20 21:18:08
boostはhppって拡張子が嫌い。

368:デフォルトの名無しさん
08/03/20 21:20:04
hppはまだいい
ippってなんじゃらほい

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

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

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

372:デフォルトの名無しさん
08/03/20 21:45:03
>>371
で、boost使ってて何かトラブったことあんの?

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

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

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


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

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

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

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

378:デフォルトの名無しさん
08/03/20 22:27:47
>>374
# vimのcpp用indentスクリプトの貧弱さは泣けてくる

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

380:デフォルトの名無しさん
08/03/20 23:27:46
っつー訳で
auto_ptr
は使うなと

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

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

382:デフォルトの名無しさん
08/03/20 23:40:52
>>381
エディタで開くときに面倒・・・ただそれだけ。

383:デフォルトの名無しさん
08/03/20 23:46:18
ファイルを分類したいときも拡張子が無いと困るな。

384:デフォルトの名無しさん
08/03/20 23:47:13
拡張子に縛られてるOSは大変だな。

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

386:デフォルトの名無しさん
08/03/20 23:58:24
ファイルシステムに組み込むよな、普通。

387:デフォルトの名無しさん
08/03/21 00:03:46
>>385
それってファイル壊してない?そんなOSがあんの?

388:デフォルトの名無しさん
08/03/21 00:03:49
拡張子だと気軽に書き換えられるからちょっと楽かも

389:デフォルトの名無しさん
08/03/21 00:08:28
xxx.tiff

xxx.jpg

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

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

390:デフォルトの名無しさん
08/03/21 00:10:13
マックバイナリというものがあってだな

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

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

393:デフォルトの名無しさん
08/03/21 05:31:04
なる

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

395:デフォルトの名無しさん
08/03/21 09:32:33
>>387
9までのMac OSってそうじゃないの?

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

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

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

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

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

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

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

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

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

405:デフォルトの名無しさん
08/03/22 17:22:14
クラスと何が違うのかわかんね

406:デフォルトの名無しさん
08/03/22 17:44:24
特別学級みたいなもんです

407:オガちゃん萌え ◆tyvkWCNtzY
08/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:デフォルトの名無しさん
08/03/22 20:22:45
stdarg.h 使うってことはマクロじゃないんでない?
まあ、その関数をさらにマクロでラップしてるんだろうけど。

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

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

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

410:デフォルトの名無しさん
08/03/22 20:51:00
なんで雑談してんの?

411:デフォルトの名無しさん
08/03/22 23:17:29
相談が無いからだろう

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

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

413:デフォルトの名無しさん
08/03/23 01:03:59
>>407
ひょっとして有名人?
関西でPGでかつどうしてんの?

414:デフォルトの名無しさん
08/03/23 01:10:46
とりあえず2期のオガちゃんは萌えた。

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

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

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

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

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


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch