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


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

C++相談室 part56



1 名前:デフォルトの名無しさん [2007/07/26(木) 00:33:07 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
class C++相談室lt;part56gt;
pc11.2ch.net/test/read.cgi/tech/1170343752/l50



458 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 08:15:51 ]
vector< struct X > Func_A();
vectorとかコレクションを返す関数って効率悪い?

459 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 08:30:10 ]
>>458
コンテナを参照で受け取ったほうがいいんじゃないか?

460 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 08:44:11 ]
そこでRVOに期待、右辺値参照にもっと期待。

461 名前:sage [2007/08/30(木) 10:25:41 ]
>>459
参照で受け取るっていうのは
void Func_A( vector< struct X >& );
か、
vector< struct X >& Func_A();
ってことですか?
とりあえず上の参照を引数にする方でやってみます

462 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 11:47:47 ]
vector< struct X >& Func_A();
はどっかに所有者用意しなきゃいけないから色々と面倒じゃね?

基本はauto_ptr戻しだと思うけど。


463 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:55:27 ]
いや、たぶん void Func_A(std::vector<struct X>& arg) のことだろう。

仕様と実装を混同するのはよくないが、実際には多くのコンパイラにおいて
「構造体(class)を返す関数」は、暗黙の引数(返り値へのポインタ)を受け取って、
そこに書き込んで返しているわけだから。

で、return直前にインスタンスを生成する以外の場合、つまり
ローカル変数としてvectorを宣言していろいろ操作しそれを返す場合
おそらくRVOされる可能性も低いんじゃないね。知らないけど。

464 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 00:49:22 ]
>>463
よくある戻り値用のポインタが指しているのは確保されただけで
まだコンストラクタが走ってない領域ね。引数で受け取る場合は
必ず構築済みのインスタンスを指すんで、仕様的にも違いがある。

最後の場合は「可能性が低い」じゃなくて RVO は不可能。

465 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 00:52:15 ]
>>464
Named RVOはVC8がやってるらしいですぜ

msdn2.microsoft.com/en-us/library/ms364057(vs.80).aspx

466 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 00:55:03 ]
ずっと前の gcc に付いてたのに削除されたな。あれは仕様的に
何か問題があったんだろうか?



467 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:09:49 ]
gcc.gnu.org/gcc-3.1/changes.html
コンパイラが勝手にやるようになったから文法からは削除されただけみたい。

468 名前:464 mailto:sage [2007/08/31(金) 01:23:50 ]
いろんな変数返されたとき困るじゃん、とか思ってたけど、そうじゃないときには
働くのね。ふーん。

469 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:35:07 ]
引数が同じで戻り値が違う型の関数を定義する方法って知らないですか?
できればクラスのメンバ関数でやりたいです
まえにWebで見かけたんだけど見つからなかったorz


470 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:48:21 ]
>>469
引数の型が同じなら関数を呼び分けることができないから、基本的に無理だろう。
戻り値の型を基底クラスのポインタにして、異なる型の派生クラスのオブジェクトの
ポインタを返すとかじゃダメ?

471 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 03:13:32 ]
>>469
こんな感じ?

struct A {
 template <typename T> T foo(int);
};

void bar() {
 A a;
 char c = a.foo<char>(0);
 short s = a.foo<short>(1);
 // ...
}


472 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 14:55:28 ]
浮動小数点の小数点以下を簡単に取る方法ってないですか?

473 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 15:13:39 ]
f - floor(f)

474 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 16:14:22 ]
>>472
modf
>>473は負数のとき正しくない

475 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 17:35:42 ]
f = f - (float)((int)f);
とかじゃ駄目?

476 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 18:59:33 ]
f > -1 ? f - floor(f) : aaaaaaaaa



477 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 19:19:41 ]
>>475
もともと整数部分がint範囲を超えてる場合があるので、
intにキャストするのはまずいと思われ。

478 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 23:01:01 ]
まさにそのための trunc (truncf) という関数があるんだが、
調べてみたらこれは C99 で定義されてるらしいから C++ では普通使えないな

とはいえ持ってる処理系に存在するかどうかは調べてみたらどうよ

479 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 23:31:14 ]
unsigned longにキャストは駄目なのか

480 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 00:05:17 ]
fmod(f, 1.0)

481 名前:469 mailto:sage [2007/09/01(土) 00:26:15 ]
>>470,471
レスdクスです、
自分が見てたのは、こんなのでした
素直に名前を変えます...

struct testFunc {
int n, m;
testFunc(int _n, int _m = 1) { n = _n; m = _m; }
testFunc(int _n, double _m) { n = _n; m = 10; }
operator int() { return n * m * 2; };
operator double() { return n * m * 3.0; };
};

void main() {
int a = testFunc(5);
double b = testFunc(5);
int c = testFunc(5, 5);
double d = testFunc(5, 5);
int e = testFunc(5, 5.0);
double f = testFunc(5, 5.0);
}

もう少し探したらそれらしいのが見つかりました
ttp://homepage2.nifty.com/well/FunnyStorage.html#mutate
やりたかったことはこんな感じ↓
ttp://anond.hatelabo.jp/20070722050021


482 名前:デフォルトの名無しさん [2007/09/02(日) 00:02:07 ]
vector<char> v;

for (int i=0; i<v.size(); i++)
{
  .....
}

というコードの i<v.size() で
> warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
という警告が出るんですが、
こういうときは unsigned i=0 にして
きっちり警告を消してしまうもんなんでしょうか?


483 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:07:42 ]
うん
警告も消すのが良い作法

484 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:11:18 ]
>>482
unsigned でも警告は消えるけど、v.size()のリターン値と同じ型を使うのが普通。

485 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:12:08 ]
これが規格厨を黙らせる、完璧に正しい方法。

for ( vector<char>::size_type i = 0 ; i < v.size() ; ++i )

486 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:16:44 ]
そこでautoとか未来を先走るわけですよ。カモンC++0x



487 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:23:34 ]
>>486
でもこの場合どうやるんだろう。
そもそも>>482はstd名前空間のvectorではないから、自前実装の俺様vectorである可能性もあるんだよね。
ひょっとしたら、size_typeなど定義されていないかもしれない。

こういうことできるの?

decltype( v.size() ) i ;

sizeofに関数を渡すと、戻り値の型のサイズになるから、
decltypeだと戻り値の型になってくれるんだろうか。

なんてことをふと考えてしまった。
どうなるの? 教えてハゲな人。

488 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:27:02 ]
さすがにバカ過ぎるだろ

489 名前:486 mailto:sage [2007/09/02(日) 00:30:15 ]
すまん、脳内フィルターで485のループがイテレータに見えていた。
for (auto i = v.begin(); i != v.end(); ++i)

490 名前:デフォルトの名無しさん [2007/09/02(日) 00:40:25 ]
>>483-489
なるほど。さんくすです。

>> 484
やっぱりそうですよね。
安易に型決めるんじゃなくてちゃんと考えるべき何ですよね。

>> 485
感動しました。



491 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 01:34:22 ]
何でイテレータ使わないの? >482
i++使う意味も判らん……

492 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 01:50:17 ]
482じゃないが、iの値自体が処理に絡む場合はイテレータ使えんだろ

for (int i = 0; i < v.size(); i++) v[i] = i;

みたいな。

493 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 01:59:53 ]
>>491
初心者だからだろ。
そのくらいわかれよ。

494 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 08:40:18 ]
>>487
できるよ。

495 名前:デフォルトの名無しさん [2007/09/02(日) 12:06:53 ]
>>491
そうですね。イテレータでもいけそうですね。
今はサンプルプログラム打ちながら勉強してるんで
そこまでは思いつきませんでした。

>>492
ブロック内部でローカル変数作れば解決できそうですね。

またひとつ勉強になりました。
ありがとうございます。


496 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:35:18 ]
>>495
そうそう、ループはイテレータで書くのが癖になると、内部でint idx = it - vec.begin()みたいなのを書くのも癖になる。



497 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:47:29 ]
C++に限ったことではないですけど、Map型とList型って似て非なる物だといいますけど、いざって時にList→MapにしたりMap→Listにしたりする時は
どうすればよいのでしょう。効率的に考えて

498 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:50:09 ]
どういう変換をしたいのかサパーリ
似て非なるっていうか、ListとMapは別物じゃ?

499 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:55:44 ]
>>498
変換というか、Map型を継承しているクラスがList型で取り出せたりその逆も・・・出来る感じの事。
説明下手ですまそ。

500 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:57:46 ]
std::map<a,b> を std::list< std::pair<a,b> >にコピーする話なら、
std::copy(map.begin(), map.end(), std::back_inserter( list ) )
でいけるんじゃね?効率なら知らん。

501 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 14:26:23 ]
list.assign(map.begin(), map.end()) だろ。

502 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 14:42:28 ]
>>499
っ アダプタパターン

503 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 01:48:49 ]
クラステンプレートに関して質問させてください、
template <class T>
class hoger {
  public:
    typedef T hogeT;

    struct fuga {
    } m_fuga;
}

main()
{
  hoger<int> Hoge;
  hoger<型>::fuga &Fuga = Hoge.m_fuga;
}

みたいなことをやろうとしたんですが、hoger内の構造体とかを
(長くなってしまうので)ローカル変数で参照作って使いたいとき
hoger::fuga &ではなくhoger<型>::fuga &とする必要があると思うのですが
hoger<Hoge.hogeT>::fuga みたいに、Hogerオブジェクトからその型の情報は
得られないのでしょうか?
こういう情報(Hogeはintを指定して作成したということ)は外で持っておくしかないのでしょうか。
よろしくお願いします。

504 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 01:53:00 ]
>>503
うん。
何回も書くようなら typedef しとく。

505 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 02:01:24 ]
>>500-502
ありがとうございます。もう少し勉強してみます。

506 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 02:03:57 ]
現状だとtemplateに逃げるしかないな。



507 名前:503 mailto:sage [2007/09/03(月) 13:52:09 ]
遅レスですみません、回答ありがとうございました。
>>506
なるほど、やっぱそうするしかないのですね・・
とりあえずはHoge.m_fuga.foo
みたいに全部書いて指定することにしました。

こういうのってテンプレートの仕様上仕方の無いことなんですかねぇ。
ヘッダにしか書けないのもそうだけど、非テンプレートコードと比べて
可読性が下がるのは、テンプレートの勉強を始めた自分にとっては
しょんぼり来てしまう(´・ω・`)
ともあれどうもありがとうございました。

508 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 14:09:43 ]
ここも将来的には auto で解決するところかな。

509 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:01:18 ]
どうでもいいけどC++0x::autoって従来のCのautoと被らね?><<>

510 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:10:05 ]
C++ソースとCソースが混在していてCソース側にautoがあった場合ってこと?
オブジェクト単位でコンパイル分ければいい
終わり

511 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:26:45 ]
いまさら誰がautoなんて使ってるんだ?

512 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 20:33:24 ]
俺だよワリオだよ

513 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:17:40 ]
>>509
暗黙のintは廃止されたから、
現在のC++での「auto x;」はコンパイルエラー。
「auto int x;」と書かないといけない。

514 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:20:45 ]
>509
C++ 的には(C99もそうなったけど)宣言時の int の省略が認められないから一意に解釈可能なはず。
C89 での auto i; と同じ意味を持たせるなら auto int i; と書く必要がある。

515 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 22:21:25 ]
思いっきりかぶりましたとさ。

516 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:35:13 ]
一つのキーワードに複数の意味なんてstaticで経験済みさ



517 名前:デフォルトの名無しさん [2007/09/04(火) 04:09:37 ]
今、VisualC++使ってます。
たとえば、123214332っていう数字があった場合、3桁区切りで123,214,332って表示しようと思ってる。
いい関数ない?やっぱ自作?,

518 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 04:13:24 ]
>>517
マルチしないでさっさとイネ


519 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 04:26:42 ]
>>517
setlocale

520 名前:デフォルトの名無しさん [2007/09/04(火) 05:33:02 ]
>>519
ありがとう。
調べてみる。

521 名前:デフォルトの名無しさん [2007/09/04(火) 07:51:20 ]
>>520
死ねカス

522 名前:デフォルトの名無しさん [2007/09/05(水) 00:48:40 ]
リリースモードでは問題なく動いてるようなんだけど
デバッグモードでアサーション?がでる。
別の似たコードでは問題ないんだけどなぁ・・・。
原因がわからん
眠い。
寝る

523 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 01:04:21 ]
>>522
リリース時も同様に値がおかしいけど、エラーとして表示されてないだけってことはないよね。

524 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 02:36:54 ]
>>522
失敗してるアサートの条件を満たさないことがあるってことだな。
デバッガで現場を押さえればおおかた原因がわかるだろ。

525 名前:デフォルトの名無しさん [2007/09/05(水) 10:39:58 ]
わっかたああああああああああああああああああああああ

526 名前:デフォルトの名無しさん [2007/09/05(水) 11:00:35 ]
vectorコンテナの要素を削除した後に
イテレータを取得し直さないで使おうとしたのがまずかったようだ。
うっかりやっちゃった。
リリースビルドではたまたま問題なかっただけってことかな。



527 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:00:58 ]
コンパイルはできるのですが、実行時にvectorの部分で止まってしまいます。
ソースは以下になります。

istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start , end);

C++を勉強始めたばかりで初歩的な質問だと思いますが、お願いします。

528 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:19:45 ]
標準入力から、ちゃんとEOFが出るまで読み込んでるのに止まるということ?

529 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:25:51 ]
>>528
デバッガで動きを確認したところ、標準入力から、
ちゃんとEOFが出るまで読み込んでいます。
しかし、vectorを作成する部分で止まってしまって
いる状況です。

530 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 15:51:51 ]
止まるってアプリが強制終了するって事か?

531 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 16:20:55 ]
入力待ちなんだと思うけどな

532 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:33:36 ]
>>530
vectorの実行するところでループしている感じです

>>531
入力のcinの部分は実行されていました

533 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 20:48:31 ]
>>527
私の環境では動きましたよ。


534 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:48:50 ]
たまにはexportを思い出してあげて下さい……。

535 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 22:57:19 ]
C++0xスレにお越し下さい

536 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:02:54 ]
>>533
#include<iostream>
#include<istream>
#include<string>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;

int main(){
cout << "Enter the seres of string::";
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start,end);





こんなプログラムですが、やはり途中vectorの後にプログラムが進みません
コンパイラはg++-4.1を使っています。

わかる方宜しくお願いします



537 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:12:44 ]
>>536
>>531

538 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:19:41 ]
WindowsならCtrl+Z、UnixならCtrl+Dだっけ。
C++と全く関係ない話だ。

539 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 12:47:03 ]
進まないとか止まるってのはどういう状態のことを言ってるんだ?
こっちで再現できるだけのソースを貼るんじゃなかったら
その辺キッチリ書けよ

540 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:03:38 ]
>>537-539
ありがとうございました。
何とか解決しました

541 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:14:10 ]
何がどう解決したのかも書かない。
これでは何の肥やしにもならない。
糞以下だね。

542 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:22:47 ]
>>541
すみません。
しかし色々いじっているうちに解決してしまったので、何がどうと言われても答えようがないのです。

543 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:35:01 ]
>>541
まぁまぁ、こういう奴はプログラミング向いてないから
いずれ挫折するなり淘汰されるなりしてこの分野から消えてくれるさ。

544 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 18:47:54 ]
と自分へメッセージ

545 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 19:32:13 ]
>>542=544
プログラマとしても人間としても糞以下だね

546 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:11:09 ]
と糞未満のものが申しております



547 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:37:28 ]
真性だな可哀想に

548 名前:デフォルトの名無しさん mailto:sage [2007/09/06(木) 20:58:04 ]
ビクンビクン・・・!!

549 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:45:03 ]
>>540>>542
>色々いじっているうちに解決
いじる前後の違いを説明できないと言うのは理解できていないということ。
解決できていない可能性が高い。たまたま動いているだけのソースを直すのが...

550 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:47:30 ]
>>545
あと、自演乙

551 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:19:22 ]
「vectorの部分で止まってしまいます」
これがダウトだったんだろうな

552 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:58:09 ]
メンバ関数ポインタから整数型へのキャストができた試しはないけど、
どうもそれを禁止している条項が規格を洗っても見つからない。
誰か、どこにあるか知ってる人いますか?

553 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:10:26 ]
肯定的な形でreinterpret_castの

554 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:55:41 ]
ポインタは同じサイズの整数型へとキャストできるけど、結果は処理系依存、ってやつのことですよね?
処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。

555 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:02:42 ]
僕の肛門からも悪魔が出そうです><

556 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:03:29 ]
ポインタを同じサイズの整数型にキャストしたときは、それを元のポインタに戻せるはずじゃ?

A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value;
mappings between pointers and integers are otherwise implementation-defined.



557 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:04:32 ]
いや、そもそもキャスト自体がコンパイル通らない。
VC++ でも g++ でも。

558 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:08:24 ]
もちろん、普通のポインタならキャストは通る。
でも、メンバポインタだと通らない。
警告じゃなくて、エラーになる。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<205KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef