C++相談室 part98at TECH
C++相談室 part98 - 暇つぶし2ch5:デフォルトの名無しさん
12/08/25 00:51:23.69
■Libraries■
[Boost]
 Boost URLリンク(www.boost.org)
 (日本語) URLリンク(www.kmonos.net)
 (日本語) URLリンク(shinh.skr.jp)
[標準ライブラリ]
 SGI-STL URLリンク(www.sgi.com)
 STLport URLリンク(stlport.sourceforge.net)
 GNU libstdc++ URLリンク(gcc.gnu.org)
 Apache C++ Standard Library (STDCXX) URLリンク(stdcxx.apache.org)
 STLFilt URLリンク(www.bdsoft.com)
 (日本語) URLリンク(episteme.wankuma.com) (※1999年発行注意)
[Loki]
 URLリンク(sourceforge.net)
 LokiPort-MSVC6sp5 URLリンク(fara.cs.uni-potsdam.de)

6:デフォルトの名無しさん
12/08/25 00:59:12.13
テンプレここまで。あと続けたい人は好きにして。

変更点
 - 禿リンクを www.stroustrup.com に変更
 - Libraries復活(順番間違えた。Booksよりこっちが先だった。)

7:デフォルトの名無しさん
12/08/25 12:46:08.11
struct edge;
struct node {
list<edge> edges;
node_data data;
};
struct edge {
node * to;
edge_data data;
};
struct graph {
vector<node> nodes;
};

こんな構造でグラフを作ってます
グラフの形状が初期化してから変わらないなら問題ないのですが
これだと要素の追加削除に無駄が多い気がします
もっとグラフの変形に強いデータ構造はないでしょうか

8:デフォルトの名無しさん
12/08/25 13:12:29.80
>7
疎なグラフならstd::map<Node, Node>でよろしかろう
ここでNodeはノードを表す型で、std::map<key, value>が勝手に行うコピーに手当てされているものとする

疎でないグラフなら行列(隣接行列)でおk
行列表現のC++における最も良いやり方は知らん


9:8
12/08/25 13:18:29.33
というより、グラフはノード(頂点)集合Vと枝集合Eの二つ組(V, E)で一意に規定されるのだから、
- Vのは、std::map<int, Node>で表してノードのキーからNodeオブジェクトを引けるようにしておいて、
- Eのは、std::map<int, int>でノードのキーの対として表現する
等の2段構えとするのが自然かも試練
詳細は何を効率よく行いたいかによる有効グラフはEの表現で工夫する


10:デフォルトの名無しさん
12/08/25 14:01:34.43
以下のコードが動くのは、環境依存ではなく、正しい挙動ですか
その場合const性を保つために暗黙的にコピー動作に変更されているということでしょうか
これをエラーや警告を出すようにすることはできませんか
特にaut

const std::wstring STRING = L"hoge";
void f(const std::wstring &s) {}
const std::wstring & e() {return STRING;}

int main()
{
  f(L"hoge");

  auto a = e();
  a.push_back(L'a');

  std::wstring s = e();
  s.push_back(L'a');
}

11:デフォルトの名無しさん
12/08/25 14:41:49.34
>>10
そこコードのどこについてどんなエラーや警告を出したいの?

12:デフォルトの名無しさん
12/08/25 15:09:52.69
仮想関数を持ったスーパークラスのポインタに派生クラスを入れて、
仮想関数を呼び出したいんだけどどうすればいいでしょうか?

class SuperC{
virtual bool func()=0;
};

class SubC{
virtual bool func(){ 何らかの処理 }
};

int main(){
SuperC* super=new SubC();
return 1;
}

インスタンス化する予定はないのにSuperCのポインタは宣言できませんって言われる

13:デフォルトの名無しさん
12/08/25 15:10:33.85
class SubC:public SuperC{
です

14:デフォルトの名無しさん
12/08/25 15:11:10.51
public:

15:デフォルトの名無しさん
12/08/25 15:15:23.98
>>14
しにたいありがとう

16:デフォルトの名無しさん
12/08/25 15:20:22.69
>>10
まずe()は、return STRING;であって return &STRING;ではないから、
e()の呼び出し毎にSTRINGがコピー(ていうか新規生成)されてそれがスタックに積まれて返される
(中略)
以降は呼び出し元の勝手


17:デフォルトの名無しさん
12/08/25 15:22:37.97
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

18:デフォルトの名無しさん
12/08/25 15:26:20.93
>>17
飽・き・た

19:デフォルトの名無しさん
12/08/25 16:51:07.33
>>16 e() の戻り値、参照ですよ。

20:デフォルトの名無しさん
12/08/25 16:54:23.47
auto&としない限り参照で受けないわな

21:デフォルトの名無しさん
12/08/25 17:30:06.45
>>10
コピーをもろに要求する文脈だが?
変更なんかされてなく

22:デフォルトの名無しさん
12/08/25 17:38:57.11
関数側で型を指定しているのにそれが無言でスルーされるのはどうなんだ

23:デフォルトの名無しさん
12/08/25 17:59:56.08
ちょっと何言ってるかわかんないですねー

24:16
12/08/25 22:40:17.16
>>19
スマン恥ずかしすぎてちょっと吊ってきた


25:デフォルトの名無しさん
12/08/26 02:14:03.65
>>10
>これをエラーや警告を出すようにすることはできませんか
>10なコードでコピーが起きるのは、e()が参照を返した後の話なのでe()の対策ではできない
エラーにしたいとしたら、STRINGをコピー不可能なクラスにすることが考えられる
例えば class wsrting2 : public std::wstring { private: wstring2(const wstring2&); /* delete */ };
というクラスを設け、>10なコードのstd::wstringをwstring2の置換する(std::wstringのかわりにwstring2を使う
他にもっと良い方法があるかもしれんが知らん




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