トップページ⇒tech
1001コメント278KB

C++相談室 part82

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2010/06/02(水) 20:20:13
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part81
http://pc12.2ch.net/test/read.cgi/tech/1273407971/
0809デフォルトの名無しさん2010/07/25(日) 21:50:48
C++の常識はプログラミング言語の非常識
0810デフォルトの名無しさん2010/07/27(火) 09:44:09
yLib1.a を利用する MyLib2.so を作ります。
このときアプリからは MyLib2.so のみをリンクすれば使えるようにしたいです。
MyLib1.a を MyLib2.so の中に埋め込むにはどうすればいいでしょうか?
0811デフォルトの名無しさん2010/07/27(火) 09:46:36
>>810 お使いの環境を確認して専用スレへどうぞ。
0812デフォルトの名無しさん2010/07/27(火) 20:46:25
VC++ で
std::vector<int> a;
typeof(a)::iterator b;
みたいなことってどうやったらできる? 一行目がvectorだったりdequeだったりしても二行目を書き換えずに済ませたい
0813デフォルトの名無しさん2010/07/27(火) 21:14:13
std::vector<int> a;
auto b = a.begin();
0814デフォルトの名無しさん2010/07/27(火) 21:14:47
decltype(a)::iterator b;
こう?
http://msdn.microsoft.com/en-us/library/dd537655.aspx
0815デフォルトの名無しさん2010/07/27(火) 21:53:37
>>812

typedef std::vector<int> container;

container a;
container::iterator b(a.begin());

必要に応じてtypedef宣言をdequeに置き換えればいい
0816デフォルトの名無しさん2010/07/28(水) 01:30:28
というかすでにdecltypeを実装してるだろ。
0817デフォルトの名無しさん2010/07/28(水) 09:21:20
>>812
VS2010にバージョンアップして
>>813
の一択ですよ
0818デフォルトの名無しさん2010/07/29(木) 13:58:02
>>808
じゃあ教えてくれ、以下のようなことをやるのにイテレータを使って
どうやればいい?

for (unsigned int i = 0; i < n; i++) {
for (unsigned int j = i; j < n; j++) {
if (i != j) {
v[i][j] = v[j][i];
v[j][i] = 0;
}
}
イテレータだとループ中、現在位置が分からないというのが最大のネック
0819デフォルトの名無しさん2010/07/29(木) 14:26:25
>>818
なんでベクター限定のコード書いてイテレータがどうとか言ってんの?
ベクター限定なんだからそのままのコードでいいじゃん。

全然関係ないけどそのコード自体見直した方がいいよ。
「私は劣化プログラマです」って言ってるようなものだよw
0820デフォルトの名無しさん2010/07/29(木) 14:44:33
コンテナや使い方によるけどイテレータ使うのは要素全部に処理するときがほとんどだなぁ
逆順イテレータとか使いにくそうじゃない?

0821デフォルトの名無しさん2010/07/29(木) 15:32:13
>>819
unsigned int使ってるって言ったの俺だよ。
劣化プログラマですっていうのは受け入れます。

元々unsigned int使わざるおえなくなったのは上のvectorの
場合なんだ。
イテレータ万能というように言う人が結構いたので、
あらためて質問という意味で書かせてもらった。
これはイテレータ使わないよね?

あと、間違えがあって、
× v[i][j] = v[j][i];
○ v[i][j] += v[j][i];

イテレータを使わないとしたら、
インデックスになると思いますが、インデックスは
unsigned intではなかったら何を使うと良いでしょう。

さらに、このコードがクソ過ぎると思われた方は、
根本的に添削していただけると助かります。
0822デフォルトの名無しさん2010/07/29(木) 15:44:18
>>820
別に無理して使うものではないんだよ。価値を感じる(理解)人が使えばいい。

コンテナであればベクターであろうがリストあろうが同じコードで処理できるんだよ。
こういう抽象化に興味がない人には無用の長物。

コンテナを逆順に走査する必要があったときにリバースイテレータを使えば、
正順と全く同じコードで逆順が実現できる。
この辺の意味がわからん人が無理して使うような物でない。
0823デフォルトの名無しさん2010/07/29(木) 15:49:08
>>821
いや、そうじゃなくてさ
for(std::size_t i = 0; i < v.size(); ++i)
の例に「イテレータ使えよ」と言っただけなのに
なんで>>818みてーな例だして噛み付いてきてんの?アホなの?

0824デフォルトの名無しさん2010/07/29(木) 15:55:15
>>823
すまん。C++始めて2週間なのです。アホです。
どんな場合でもイテレータは使えるのかと本気で期待しました。
が、数値計算的なことには無力と分かって良かったです。

>>822
もっと抽象的な処理で有効ということですね。
ありがとうございます。
0825デフォルトの名無しさん2010/07/29(木) 15:55:20
>>821
if文無駄じゃね?
0826デフォルトの名無しさん2010/07/29(木) 15:55:36
>>821
>イテレータ万能というように言う人が結構いたので、
多分意味を取り違えてる。

>これはイテレータ使わないよね?
やりたいことはベクター(配列)であることが絶対条件だし、
配列のインデックスでアクセスしたいんだから、素直にインデックスでアクセスしろよ。

>根本的に添削していただけると助かります。
if 文使う必要もないでしょ。普通のプログラマなこんなコードは書かない。
0827デフォルトの名無しさん2010/07/29(木) 15:59:26
>>824
>が、数値計算的なことには無力と分かって良かったです。

全然理解できてないぞw
0828デフォルトの名無しさん2010/07/29(木) 16:02:08
>>822
そうだね。まあListなら使うしかなさそうだけど。
stlのバグ見つけたときから過信して何でも使わないようにしてる。
0829デフォルトの名無しさん2010/07/29(木) 16:15:58
>>818
現在位置ならstd::distanceで求めれば?
0830デフォルトの名無しさん2010/07/29(木) 16:26:05
ここまで、unsigned int ついてツッコミなし
0831デフォルトの名無しさん2010/07/29(木) 16:30:50
>>829
ありがとうございます。STLは奥深いですね。
勉強します。
0832デフォルトの名無しさん2010/07/29(木) 16:38:44
>>828
それでいい、今の君には無用の長物
0833デフォルトの名無しさん2010/07/29(木) 16:54:54
>>830
気になるのでどの辺がつっこみどころなのか教えてくれませんか
0834デフォルトの名無しさん2010/07/29(木) 17:18:27
unsignedが出てきたら間違い
0835デフォルトの名無しさん2010/07/29(木) 17:27:36
>>833
気にしない方がいいよ。
>>830 は size_type を使うように誰かに教わって、それが全てだと思い込んでいるのだろうw
0836デフォルトの名無しさん2010/07/29(木) 17:40:32
830はsize_typeの人ではなく、
彼自身も知りたがってるとは考えられないのか?
0837デフォルトの名無しさん2010/07/29(木) 18:58:51
>>818
イテレータで…という質問の答えにはならないけどこうかな

// boost-ublas
auto u = triangular_adaptor<decltype(v), upper>(v);
auto su = triangular_adaptor<decltype(trans(v)), strict_upper>(trans(v));
auto value = u + su;

確かにイテレータは行列や四元数なんかのアクセスには適当じゃない
行列は行列で別の抽象化の技法があるのでそっちを使えばいいんじゃないかな
0838デフォルトの名無しさん2010/07/29(木) 19:17:19
>>837△
すげっ、けど変態
0839デフォルトの名無しさん2010/07/29(木) 19:30:08
イテレータだろうが添え字だろうが要は道具なんだから使い方次第
0840デフォルトの名無しさん2010/07/29(木) 20:26:27
イテレータ知らないから使えない(´・ω・`)
0841デフォルトの名無しさん2010/07/29(木) 20:37:19
イテレータって[]←これだよね
0842デフォルトの名無しさん2010/07/29(木) 20:45:58
>>841
それは添字演算子
0843デフォルトの名無しさん2010/07/29(木) 21:28:55
生配列を使わなくなって何年も経つ。
0844デフォルトの名無しさん2010/07/30(金) 00:53:06
C++0xではテンプレートメタでenum判断できますか?
0845デフォルトの名無しさん2010/07/30(金) 01:15:28
>>844 enum判断するとは?
0846デフォルトの名無しさん2010/07/30(金) 05:11:20
>>844
std::is_enum
0847デフォルトの名無しさん2010/07/30(金) 12:01:54
nullと0を分けてくれませんか?
0848デフォルトの名無しさん2010/07/30(金) 12:06:31
nullならをそういうふうに定義すればいいだけでは?
0849デフォルトの名無しさん2010/07/30(金) 14:38:20
>>846
おお、こんな関数がありましたか。
ちなみに0x以前にもあります?
0850デフォルトの名無しさん2010/07/30(金) 21:30:40
queueとstackとvectorの使い分けの例をよろしくお願いします
0851デフォルトの名無しさん2010/07/30(金) 21:54:52
vectorで作ってたら前から挿入したくなってムラムラしてdequeにした、みたいな?
0852デフォルトの名無しさん2010/07/30(金) 22:09:27
adaptor
0853デフォルトの名無しさん2010/07/30(金) 22:20:48
スタックはたぶんインデックサが無い。
ベクタはメモリが一本だから、旧来のファイル等のAPIに使える。
キューは順番が必要なとき使う。
デキューは上記のとき意外で使う。

俺は特に制約が無いときはデキュー使ってる。
細かくアロケートしてメモリ効率よさそうだからな。
0854デフォルトの名無しさん2010/07/30(金) 23:05:40
シーケンスの中間への挿入/削除が多ければlist
シーケンスの両端への挿入/削除が多ければdeque
そうでないならvector を使えと規格には書いてある

queueとstackはその名のとおりだが用途に悩むくらいなら使わなくていいと思う
どうせ中身はdequeだし

規格には- の参照先はこちら↓
http://www.kuzbass.ru/docs/isocpp/lib-containers.html#lib.sequence.reqmts の 2
0855デフォルトの名無しさん2010/07/31(土) 14:01:34
C++で文字コードをunicodeで
やるにはどうしたらできますか?
0856デフォルトの名無しさん2010/07/31(土) 14:06:29
wstring
0857デフォルトの名無しさん2010/07/31(土) 14:07:30
VCならオプションで文字セットをUnicodeに設定して
wchar_t a = L"あいうえお";
std::wstring b = L"かきくけこ";
wprintf(L"%s %s\n",a,b.c_str());
とかやればいいんじゃないの
0858デフォルトの名無しさん2010/07/31(土) 14:08:21
文字を入れるにはどうやるんですか?
0859デフォルトの名無しさん2010/07/31(土) 14:11:58
すみませんMINGW(GCC)なのでわかりません。
教えてください。
0860デフォルトの名無しさん2010/07/31(土) 14:18:58
UNICODEてなんだよ
0861デフォルトの名無しさん2010/07/31(土) 14:59:23
GCCでそのLをつけた書き方はどうやりますか?
0862デフォルトの名無しさん2010/07/31(土) 16:10:47
TCHAR、_T()マクロ使えばいいんじゃね?w
0863デフォルトの名無しさん2010/08/01(日) 00:24:36
メンバー変数を持つ抽象クラスの書き方を教えてください。
ID番号を持たせたいです。
0864デフォルトの名無しさん2010/08/01(日) 00:37:32
std::tr1::regex
を使って
"あああああ"を"(1)(2)(3)(4)(5)"
のようにマッチする度に値を変化させて置換する方法ってありますか?
0865デフォルトの名無しさん2010/08/01(日) 00:38:42
>>863
なにを困ってるかわからん。くわしく
0866デフォルトの名無しさん2010/08/01(日) 00:40:56
class Interface
{
 virtual int id = 0;
}

のようなこと
0867デフォルトの名無しさん2010/08/01(日) 00:51:52
virtual int id() = 0;
0868デフォルトの名無しさん2010/08/01(日) 01:10:30
インターフェースっていうのは
0869デフォルトの名無しさん2010/08/01(日) 01:10:37
お断りさせていただきます
0870デフォルトの名無しさん2010/08/01(日) 01:14:17
やはり言語のバグか
策定に私を参加させなかったのが裏目に出ましたね
0871デフォルトの名無しさん2010/08/01(日) 01:16:36
>>866
どんな動作を期待してるんだよ
0872デフォルトの名無しさん2010/08/01(日) 01:23:21
普通にclass書いてコンストラクタをprotectedにでもしとけ
0873デフォルトの名無しさん2010/08/01(日) 11:09:33
const int func();

……
case func() : // コンパイルできない
……

なぜcaseのところにfuncが入らないのでしょうか?
0874デフォルトの名無しさん2010/08/01(日) 11:11:28
定数式でないから
constじゃなくconstexprを付けないとだめ
0875デフォルトの名無しさん2010/08/01(日) 12:06:55
なぜわざわざconstとconstexprで分けられているのでしょうか?
0876デフォルトの名無しさん2010/08/01(日) 12:16:17
↓wikipediaから引用

int GetFive() { return 5; }

int some_value[GetFive() + 5]; // 10 要素の整数配列を作りたいが、C++ では不正。

GetFive() + 5 が定数式でないため、これは C++ では不正となる。
実際には GetFive は実行時に一定値を返すが、
コンパイラにそれを知らせる方法がないのである。
理論上、関数はグローバル変数に影響を与える、
実行時に結果が変わる他の関数を呼ぶ、などの理由がある。
0877デフォルトの名無しさん2010/08/01(日) 13:19:13
問1
constにconstexprの機能を持たせた場合予想される弊害を答えなさい。
0878デフォルトの名無しさん2010/08/01(日) 13:27:44
>>877
どこにつけるconstについてか述べなさい
0879デフォルトの名無しさん2010/08/01(日) 13:28:38
constexprが何か知らない俺が困る
0880デフォルトの名無しさん2010/08/01(日) 13:29:53
case の比較順序が未規定だから

switch(x)
{
case func1(): goto L1;
case func2(): goto L2;
}
goto L3;

L1: //func2() が実行されたかどうかわからない
L2: //func1() が実行されたかどうかわからない

L3:

# 配列やグローバルの話に飛ぶ必要はない
0881デフォルトの名無しさん2010/08/01(日) 13:40:29
switch(...) {
 case func():
 ...

// a.cpp
const int func() {
 return ...;
}

// a.h
const int func();

constが付いていてもコンパイル時定数ではないのでNG
0882デフォルトの名無しさん2010/08/01(日) 13:51:07
>>880
>ほにゃららが実行されたか分からない
分からなくていい場合は?

>>881
>constが付いてもいてもかくかくしかじか
コンパイル時定数ではなくてもいい場合は?

C++より自由に何でも書けてプログラマーの思考を阻害することなく、そのまま表現できる言語ないですか?
0883デフォルトの名無しさん2010/08/01(日) 13:53:14
コンパイル時定数ではなくてもいい場合は別にいいんじゃね
ただしcaseラベルはコンパイル時定数でなければならない
0884デフォルトの名無しさん2010/08/01(日) 16:26:47
>>882
C++にこだわりがないのなら、RubyとかPythonとかを使えばいいじゃない
0885デフォルトの名無しさん2010/08/01(日) 16:46:59
C++を勉強中でEffective、ExceptionalやD&Eを読んで
今はModern C++ Designを読んでるけど、なにこの変態言語…
みんなC++の言語仕様を全部理解して使ってるの?
0886デフォルトの名無しさん2010/08/01(日) 16:49:47
/dev/nullみたいな、空のストリームを作ることって簡単にできますか?
0887デフォルトの名無しさん2010/08/01(日) 16:51:12
理解してないよ!
0888デフォルトの名無しさん2010/08/01(日) 16:53:22
>>885
C++0xでぐぐるともっと幸せになれるよ!
0889デフォルトの名無しさん2010/08/01(日) 16:53:50
仕様が巨大過ぎるからコーディング規約で使う機能を絞ってる。
0890デフォルトの名無しさん2010/08/01(日) 20:07:37
>>882
わからなくていいかどうかを、コンパイラに通知する方法を思いついたら禿にでも相談してみては?
0891デフォルトの名無しさん2010/08/01(日) 20:54:47
> >ほにゃららが実行されたか分からない
> 分からなくていい場合は?

if文使えばいいでしょ。バカなんじゃないの?
0892デフォルトの名無しさん2010/08/01(日) 21:20:33
>>889老害乙
0893デフォルトの名無しさん2010/08/01(日) 21:27:05
>>892
お前のところはなんでもありでやってるのか
0894デフォルトの名無しさん2010/08/01(日) 21:32:36
規約とか決めるからあんな便利な機能あるのに使えないって場面が増えるんだろw
新しい機能使うときは当然慎重になるべきだが規約で縛る必要はないと思う。
0895デフォルトの名無しさん2010/08/01(日) 21:36:15
Google先生ですら規約で機能制限してるのに
アホプログラマーが好き勝手にやらかすのを黙って見てるのはもっとアホだろ。
0896デフォルトの名無しさん2010/08/01(日) 21:40:52
機能追加には慎重になるべきだと言っている文盲がw
規約を定期的に見直す作業するならいいけど、
そんな余裕はないだろうから規約制限しない方がいいと思ってる。
0897デフォルトの名無しさん2010/08/01(日) 21:44:41
なんか言ってることがおかしい。
・制限しない方がいい
・定期的に見直すべきだ
・新しい機能使うときは当然慎重になるべき
全部矛盾してるぞ。
0898デフォルトの名無しさん2010/08/01(日) 21:47:12
コード規約は正しい記法を奨励し、正しくない記法を拒絶するようにするべき
0899デフォルトの名無しさん2010/08/01(日) 21:49:02
オマエ文網だなwww
第一義的には制限するべきではないが機能追加には慎重になるべき。
稼動実績ないわけだから当然だよなw
仮に定期的に規約見直すならば、制限してもいいかなといっている。
0900デフォルトの名無しさん2010/08/01(日) 21:49:27
なんで規約があるのかわからないから「あんな便利な機能があるのに使えない」とか言っちゃう
0901デフォルトの名無しさん2010/08/01(日) 21:50:05
規約制限しない結果、バグだらけになったりするかもな。
慎重になるかどうかはプログラマーによるわけで、慎重にならないバカなプログラマーが出ないように規約で制限してんだろ。
0902デフォルトの名無しさん2010/08/01(日) 21:51:06
>第一義的には制限するべきではないが機能追加には慎重になるべき。

だめだこりゃ。なんで規約があるのかを考えろよ
0903デフォルトの名無しさん2010/08/01(日) 21:51:41
個人レベルで慎重になるとかありえないだろwww
リーダーが責任を負うレベルでの話だよwww
0904デフォルトの名無しさん2010/08/01(日) 21:53:27
規約といってもいろんな規約があるわけで、今は機能追加に関して話してんだろ?w
規約の意味とか論理飛躍も甚しすぎるんだがwww
0905デフォルトの名無しさん2010/08/01(日) 21:55:59
徐々にwが増えるんだな。
どのレベルでとか誰が判断するんだ?
ひとつの問題あって、それが個人レベルかリーダーレベルか。
そういうどうでも良い問題を避けるためにも規約は必要。
定期的に規約を見直すのは必要なことだが、出来ないなら規約はいらないというのは根本が間違っている。
0906デフォルトの名無しさん2010/08/01(日) 21:57:00
むしろそろそろスレチなので止めるべき
0907デフォルトの名無しさん2010/08/01(日) 22:03:03
バグで客に迷惑かけたら責任を取る、そのレベルw
ぶっちゃけプログラマなんて何の責任もないんだがw
問題起きたらプロジェクトリーダーが全て責任を追わなきゃいけないのは当然だろw
オマエはそのレベルの立場の人間じゃないのか?
規約の見直し作業を仕事に組み込む余裕なんてないから無理だろって言ってるんだけどな。
なんか話がまとまらないしスレチ言われたからもうやめる。
0908デフォルトの名無しさん2010/08/01(日) 22:07:56
お前がアホだということはみんなに充分伝わったから安心しろよ
レス数が900を超えています。1000を超えると表示できなくなるよ。