【初心者歓迎】C/C++室 Ver.74【環境依存OK】 C++なのに、後で使うローカル変数をあえて関数の最初で宣言するのは VSのデバッグ機能などに寄与するとかあるんでしょうか? 自分はC++覚えたてのときから変数は必要になってから宣言即初期化してたんですが…
>>952 ないよ。ただの悪習でしかないから、宣言即初期化(そして const )を貫くがいい。
>>951 insertとかeraseは使えないのだろうか。
メンバ関数にないって書いてるから。
>>957 日本語不自由なやつだな。
「削除→挿入によってキーへの代入と同等のことをする操作は巨大なmapで何回もやると
ものすごい時間が掛かるから、メンバ関数には入れなかったのだろう」
ということ。
なんでキーを変更するようなメンバ関数の有無の話になってんだ? 誰かほしがってたのかな。
>>944 がそういうoperator=()を望んでる
そうは見えないが、日本語不自由だから本当はそれをほしがってることに気づけてないのか
頭も不自由のようだな
pair<string, int>を使えとかそういう話じゃないの?
だからoperator=の事とちゃうんか? operator[]と組み合わせて使うとまた別の意味になるけど hogeMap["abc"] = 1; とか 次のようにするとキーはそのままで値のみが置き換わるのがわかる std::multimapはまた別の動作をする (しかしラムダ式使いてーなー) template <class U, class V> void print(std::pair<U, V> p) { std::cout << '[' << p.first << "] = " << p.second << std::endl; } int main() { std::map<std::string, int> hogeMap; hogeMap["abc"] = 1; std::for_each(hogeMap.begin(), hogeMap.end(), print<std::string, int>); hogeMap["abc"] = 2; std::for_each(hogeMap.begin(), hogeMap.end(), print<std::string, int>); }
for_eachの練習ならよそでやってくれ
うめ
968 :
デフォルトの名無しさん :2011/03/01(火) 02:00:25.02
Eclipse CDTでやってるんだけど Shared Libraryとして作ったプロジェクトのソースにmain()って書けないの? デバッグはどうやれば? つまり -shared オプションがつけられた場合に リンカはmain()が含められたオブジェクトファイルをリンクしてくれるのかどうか ということかな
969 :
デフォルトの名無しさん :2011/03/02(水) 06:56:53.41
Javaみたいにパッケージ内で1つの名前空間を使う方法ってありますか? いちいちnamespace{}で囲わないといけないんでしょうか
using namespace
アドレスってどの型に入れればよいですか? windowsならLONG_PTR?
void*
ポインタ型
976 :
デフォルトの名無しさん :2011/03/03(木) 23:17:58.81
ヘッダーファイルだけで構成されたライブラリが流行っていますよね。 こういうライブラリで静的な変数をうまく初期化する方法はあるでしょうか? すぐに考え付く方法として、関数のスコープで静的な局所変数を宣言し関数の戻り値として利用する方法です。 int const * getData() { static int const data[] = { 1, 2, 3, 4, 5 }; return data; } この方法は、現行のC++ではスレッドを利用した時に破綻します。(C++0xでは保障されるようです。) しかし、ヘッダー内で普通に大域変数として初期化すると、DLLとDLLを利用するプログラムの両方に 実体が出来るため、リンクに失敗します。 こういう場合、一体どうすればいいのでしょう?
普通にconst int ARRAY[] = {1,2,3,4,5};ではだめなん?
VC限定だが__declspec(selectany)
979 :
デフォルトの名無しさん :2011/03/03(木) 23:31:03.54
プロセス内に唯一つの大きなテーブルが欲しい。 これは読みだすだけで初期化以外に書き込みは発生しません。 具体的には、構文解析用のAction、Goto、SemanticActionの各テーブルです。 パーサーのインスタンスごとにメモリーを確保、初期化しても最近のコンピューターであれば問題 ないかもしれませんが、できれば無駄をなくしたいと思った次第。 よろしくお願いします。
new deleteかmalloc free で確保すればいいと思うが、何が疑問なんだ?
モリマップドファイルとかDB使うとか?
982 :
デフォルトの名無しさん :2011/03/03(木) 23:48:47.83
メモリマップドファイル^^
>>976 Singleton使ったらうまく行かない?
985 :
デフォルトの名無しさん :2011/03/03(木) 23:58:48.19
>>984 うまくいくけど、クリティカルセクションが必要になってスマートじゃない予感がする。
文字列化 const char *table = "\x00\x01\x02........";
987 :
デフォルトの名無しさん :2011/03/04(金) 00:40:52.35
ごくありふれた問題ですぐに回答がつくかと思ったらそうでもないのか。 C++0x待つか。 初期化タイミングが保障されるらしいし。
組み込み型定数なら初期化タイミングなんて気にしなくてよくね?そういう話じゃないの?
>>985 スマートである必要はないだろ
動けば今はいいんだろ?
規格で保証されてない動作をあれこれ考えるより余程いい
MinGWで開発中の者です。 struct Info{ int num1; int num2; std::string str1; }; int Delete(struct Info *pinfo,std::list<struct Info>& list){ for(std::list<struct Info>::iterator itr=list.begin();itr!=list.end();itr++){ if(pInfo==(*itr)){//ここで「no match for 'operator==' in 'pinfo == itr'」 //削除処理 } } } int main(){ std::list<struct Info> list1; struct Info info; //要素追加処理。 struct Info del; del={2,3,"foo"}; Delete(&del,list1); return 0; } となってしまいます。 どのようにすれば良いのでしょうか。
>>990 型が合ってないのが悪いんだから、
if(pInfo==&(*itr))
でいいんじゃね?
次スレお願いします
>>990 struct Info の operator == を自前定義したうえで *pInfo == *itr
char *abc[][3] = { {"xyz", "uvw", "rst"}, {"opq", "lmn", "ijk"}, {"fgh", "cde", "@ab"}, {"aho", "baka", "shine"} }; で初期化出来ますが、 *abc[][3] の配列(というか *abc[][3] を指すポインタ)は、 char **xyz[][3] = {abc, def, ...}; じゃ代入出来ないんですけど、 どう書いたら良いでしょうか?
char *(*xyz[])[3] = {abc, def, ...};
ややこしく書かずに typedef const char* type[4][3]; type* p = &abc; とでも書いたらどうだろう
>>996 出来ました!!
ありがとうございました!!!
質問いいですか?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。