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


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

【C++】STL(Standard Template Library)相談室 8



1 名前:858 [2007/12/24(月) 03:41:59 ]
C++標準ライブラリの一つ、STLについて。

前スレ
【C++】STL(Standard Template Library)相談室 7
pc11.2ch.net/test/read.cgi/tech/1185986999/

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

873 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 12:52:05 ]
散々既出だけど、vectorの場合は、int* p = &v[index];も可能。
ただ、end相当の&v[v.size()]は未定義だから、&v[0] + v.size()を使えって話があった気もする。

874 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 12:58:44 ]
いいえ。

875 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:01:28 ]
>int* p = &v[index];
これはvectorに限らずあらゆるコンテナで可能だろ

876 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:08:38 ]
そうですね。

877 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:09:09 ]
え”?
dequeでコンパイルエラー出たけど、気のせい?
もうテストコード消しちゃったお。

878 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:11:06 ]
>>875
釣りですか?

879 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:17:54 ]
いいえ。

880 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:37:04 ]
不正確な物言いだったな
operator[]を持っていて、value_typeがintであるような、あらゆるコンテナのインスタンスについて可能、と言いたかった

881 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:55:22 ]
それはうっかりだった、すまん。
vectorのポインタの場合は、配列の要素を指すポインタの如く、
ポインタ演算を使用してそのvectorインスタンスの保持する他の要素も参照できると言えばいいか。



882 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 13:58:46 ]
std::stringは、イテレータンを無視して、何文字目かを数字で指定しても、おkだおね?

883 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 14:03:08 ]
>ただ、end相当の&v[v.size()]は未定義だから、&v[0] + v.size()を使えって話があった気もする。
で、これは?

884 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:09:32 ]
&v[0]の時点でただのポインタなんだから、それにどんな値を足しても
指してる先にアクセスしなきゃ大丈夫でしょ。

885 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:30:22 ]
配列の最後の要素の一つ後の要素のアドレスをポインタ演算に
使用することは規格で認められていた記憶がある。
これが正しければ &v[v.size()] は有効だと思う。

886 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:30:54 ]
>>884
ダウト。

887 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:31:47 ]
stringのuppercaseはどう書きますか?

888 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 15:56:50 ]
>>885
その式は右から評価するからアウト

889 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:01:43 ]
>>885
vectorのoperator []は多重定義された関数なのだから、それとは別に規定があるはず。
と思ってX 3014見てみたが、23.1.1 列の中で参照されている表68に
a[n]は*(a.begin() + n)と書かれているがそれ以上は何もない。
もちろん、atはn >= a.size()のときにout_of_rangeを送出と書いてあるけど。

890 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:23:53 ]
>>885
v[v.size()]の時点で鼻から悪魔確定だろ

891 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:27:30 ]
>>890
なんで?



892 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:29:38 ]
>>886
なんで?

893 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:36:28 ]
>>889
a.begin() + n は dereferenceable ではないので
これを dereference した時点で規格としては undefined behavior,
でよいのでは?

894 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:48:51 ]
std::string に trim が無いなんて不自由でつね。

895 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:51:25 ]
まぁ、色々足りないものはある。

896 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:25:46 ]
>>888
No

アドレス演算子&はオペランドが[ ]演算子の結果の場合、単項&演算子と
[ ]演算子が暗黙に意味する単項*演算子は評価されず、&演算子を削除し
[ ]演算子を+演算子に変更した場合と同じ結果となる。

つまり、&v[v.size()] は v + v.size() に評価されるのであって、
&(*(v + v.size)) とは評価されない。

897 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:27:38 ]
>>888
C言語もあまり詳しくないだろ?K&Rにも、>>885が正しいことは書いてある。
かつ、C++でも同じ。

898 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:44:24 ]
>>896
それはポインタについてじゃないのか
>>889も言ってるが、vectorの[]や、vectorのイテレータの+と*は単なる関数かもしれない訳で、
ポインタについての規定がそのままあてはまるとする理由はないだろ

899 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 18:01:34 ]
stringの数字チェックはできますか?

900 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 18:47:36 ]
>>898
そのとおりだ。ポインタの話しと思ってた。

901 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 18:52:15 ]
&v[0] + v.size()でOK



902 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:31:04 ]
私はヘタレなのでそんなに悩んでる暇があったらイタレータ使っちゃいます
ごめんなさい

903 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:33:11 ]
>>902
僕もです。

904 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:01:29 ]
サイズが0のときの&v[0]は不定だ。VS2005だとアサート。

905 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:39:14 ]
おかしなコード書きすぎ><

906 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 08:41:26 ]
結局STLって無いと困るけど、書き難いね。

複数ファイルイメージみたいなのをバッファに持っておきたいばあいは、
みなさんどうされてます?
void*?char*?


やっぱ、vector <char*>みたいな感じ?

907 名前:906 mailto:sage [2008/02/22(金) 08:54:20 ]
*で宣言しちゃうと、メモリの開放を書かないと逝けないから、
vector <string>の方が良いかなぁ?

908 名前:906 [2008/02/22(金) 09:30:49 ]
たまには質問にも応えて欲しいお。

909 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:05:33 ]
>>906
テキストファイルである保証があるなら兎も角、普通はvector<string>はつかわんだろ。
つーか、ファイルの内容によって違うものを一般化されても困る。

910 名前:906 mailto:sage [2008/02/22(金) 10:06:37 ]
テキストファイルじゃなくてバイナリファイルです。

TMemoryStremaみたいなのが欲しいんです。

911 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:08:23 ]
ファイルをvector<char>に入れるとして、複数ファイルならvector<vector<char> >でいいんでね?
なにをやりたいか判ればもっと適当な方法もあるかもしれないけど。



912 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:08:31 ]
>>906 vector<char> じゃないのか?

913 名前:906 mailto:sage [2008/02/22(金) 10:27:17 ]
>vector<vector<char> >

おk。
ファイルのロードとか要りますよね。
出来上がったクラスが標準だったり、ネットに転がってて欲しい。

914 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:40:03 ]
クラス? 何を言ってるんだ? このスレがなんだか判っているか?
STLの使い方を提示されたんだから、後は自分で勝手に実装すればいいだろ。

915 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:46:03 ]
だって普段STL使ってる人たちが、便利な標準クラス使ってるか自作クラスライブラリそろえてるに決まってるじゃん。

916 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:55:17 ]
もうかまうなよ。

917 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 11:00:59 ]
>>913
あのさ、先日からC++BuilderのVCLを移したいみたいだけどさ
STLはVCLと範疇が違うんだから、ファイルロードだのなんだのは
自分でやってくれるかな。

918 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:53:18 ]
じゃ、せめて、

>vector<vector<char> >

をカプセル化した便利なクラスだけでも教えてorz

919 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:54:32 ]
そんなものないよ

920 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:57:18 ]
そういえば、copiedはともかくfile_rangeくらいBoostにあってもいいのにって思う。
namespace oven = pstade::oven;
std::size_t n;

std::vector<std::vector<char> > v;
v.reserve(n);

for (std::size_t i = 0; i < n; ++i)
{
std::ifstream is(...);
v.push_back(oven::file_range<char>(...) | oven::copied);
}

921 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:00:54 ]
どう見てもifstreamの行は消し忘れです、本当に(ry。



922 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:56:03 ]
string::compareはありますが、大文字小文字を無視してcompareする場合は、皆さんどうされてるのでしょうか?


923 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:03:55 ]
stricmp

924 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:06:51 ]
文字列まわりはSTLに期待すんな、クソだ

925 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:12:43 ]
そーなんですか。

構造体まわりはSTLで完璧ですが。

で、文字列まわりは何使えば良いですか?
ってstringしか無いじゃん。
あー、ハイパーなstringのソース落ちてないかなぁ。

926 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:17:24 ]
構造体てw

927 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:18:47 ]
あ、structもclassも等価らしいですが、
何もしないデータの塊にはstruct使ってます。

変ですか?

928 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:21:17 ]
>stricmp

試してみましたが、やっぱ、.c_str() 付けないとコンパイル通りませんね。
これくらい標準にして欲しいお。

929 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:36:00 ]
春だなぁ

930 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:42:26 ]
まだ冬ですよ

931 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:57:45 ]
これがvipクオリティ



932 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:13:44 ]
ファイルや文字列処理は微妙にスレ違いな気もするなぁ。
boostでよければboost.string_algoに色々あるしSTLにこだわる必要はないだろ。
boost.string_algoなら>>922はboost::algorithm::ilexicographical_compare。

ところでstricmp/strcmpiって標準だっけ?

933 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:49:51 ]
std::string って、
==
で比較できましたっけ?

934 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:55:53 ]
できる

935 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 17:53:15 ]
>>932
stricmpもstrcmpiもstrcasecmpも標準Cには存在しない。
最近のPOSIXにはstrcasecmpがあるけど、locale依存なので
画面に表示する文字列をソートするくらいしか使い道がない。

936 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 18:08:08 ]
>>935
なるほど。d

937 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 20:58:33 ]
一瞬、初心者歓迎スレきたのかと思ったぜw

938 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 00:16:23 ]
似たようなもんかもw

939 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 00:18:06 ]
string って STL に含まれるの?

940 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 00:50:55 ]
ど  っ  ち  で  も  い  い

強いて言うならC++標準。
つまんないことにこだわらんでも良いよ。

941 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 00:51:02 ]
頻出ネタの上に面白くない議論にしかならないのでスルー



942 名前:デフォルトの名無しさん [2008/02/24(日) 11:20:20 ]
std::map<int, std::string> string_map;
assert(string_map[1].empry());
assert(string_map[100].empry());
assert(string_map.size() == 2);

つまり、存在しないキーを operator[] で指定すると
そのキーが自動的に挿入されて値はデフォルトコンストラクタ
で作成されてしまうということですか?
うむむ、例外になってくれればいいのだが。

std::vector でも operator[] は例外を出さないから
それに対応した動作ということなんでしょうか?

943 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 11:45:26 ]
単に
string_map[1] = "foo";
ってやったときに存在しないキーを指定すると自動的に追加されてほしいからじゃね?

944 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 11:53:02 ]
そうそう
存在するかどうかも含めて問い合わせるにはfindを使う

945 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 13:17:17 ]
>>942
次の規格の改訂では、存在しないキーに対して例外を投げる at() が追加されるよ。

946 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 13:58:04 ]
統一性のある素晴らしい改訂ですな。

947 名前:デフォルトの名無しさん [2008/02/24(日) 14:42:27 ]
まぁ copy_if の一軒もあるしな

948 名前:デフォルトの名無しさん [2008/02/24(日) 14:42:47 ]
for_each_if とかもほしい

949 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:43:47 ]
なんで標準にcopy_ifがないんだって話?

950 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:47:46 ]
vector に data が追加されたり、
何で無かったんだ? って機能が色々追加されてるみたいだね。

951 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:48:12 ]
そういえば規格の改訂で copy_if() が追加されないのはなぜなんだぜ?



952 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:54:32 ]
最新ドラフト(これ、最終ドラフトだっけ?)にも載ってないな。

953 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:55:44 ]
今公開されてる最新は n2521.pdf のはず。無いな。

954 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:57:21 ]
禿が10年越しの天丼ねらってる、とか?

955 名前:デフォルトの名無しさん [2008/02/24(日) 14:59:55 ]
質問失礼します。。
struct ST{
  int n;
};
vector<ST> v;
set<ST> s;

int main(){
  ST x={0};

  v.push_back(x);
  vector<ST>::iterator itv=v.begin();
  itv->n++;

  s.insert(x);
  set<ST>::iterator its=s.begin();
  its->n++;
}
のようにすると、its->n++;の行で
error: increment of data-member ‘ST::n’ in read-only structure
と出るのですがvectorで出来てsetで出来ないのはなぜでしょうか?

956 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:03:57 ]
今すぐsetのイテレータタグを調べるんだ


957 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:04:24 ]
ごめんnの方だったのね

958 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:04:44 ]
>>955
set は常にソートされた並びを保っている必要があるから。

959 名前:955 mailto:sage [2008/02/24(日) 15:17:04 ]
>>956-958さん
iterator経由で勝手に中身を変えられたら困るということは、
setとmapだけの例外扱いなのですか?
イテレータタグというのは初見なのでちょっと調べてみます。

960 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:28:50 ]
map は second の方は変えれる。

961 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:28:54 ]
>>959
map の場合は value_type である pair の first がソートキーなので、これは
書き換えられないように const が付いてる。 second は順序に関係ないので
書き換えてもいい。



962 名前:955 mailto:sage [2008/02/24(日) 15:31:13 ]
>>960,961さん
なるほど、そうなっているのですね。
よく分かりました、どうもありがとうございました。

963 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 15:43:02 ]
compareが感知しないメンバなら、mutable付けていじることはできるけどね。

964 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 16:01:24 ]
まぁそれは奥の手ということでw

965 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:04:12 ]
ファイルに簡単に新規作成、追記ができる方法ありますか?

ofstreamって、bad()とかfail()とか使いにくい。

966 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 14:18:47 ]
ofstream.exceptions(badbit | failbit);
ってやっとけばいちいちチェックしなくても例外吐いてくれると思う
それが使いやすいかどうかはわからんが…

967 名前:965 mailto:sage [2008/02/25(月) 14:25:43 ]
サンクス>>966

968 名前:デフォルトの名無しさん [2008/02/25(月) 16:54:00 ]
そんな機能があったとは

969 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 17:08:09 ]
そういえばostreamのfail()が真になる事ってあるの?

970 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 17:24:02 ]
>>920
>file_range

ずっと見てても分からないんですが、file_rangeって何ですか?

971 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 17:29:12 ]
ファイルの先頭から末尾の一つ後ろまでを指すイテレータのペアみたいなもん



972 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 17:30:41 ]
使い方キボン

973 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 18:12:11 ]
複数のファイルがあって、それがローデータだったり、テーブルデータだったりします。

複数のファイルを混在させずに簡単にロードしてしまうクラスが欲しいのですが、どんな実装になりますか?






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

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

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