【C++】STL(Standard Template Library)相談室 7
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/08/02(木) 01:49:59前スレ
【C++】STL(Standard Template Library)相談室 6
http://pc11.2ch.net/test/read.cgi/tech/1160821240/
過去ログ・リンク・書籍紹介は >>2 以降
0002デフォルトの名無しさん
2007/08/02(木) 01:51:45【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
【C++】STL(Standard Template Library)相談室 ;4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
【C++】STL(Standard Template Library)相談室 3
http://pc8.2ch.net/test/read.cgi/tech/1116559700/
【C++】STL(Standard Template Library)相談室 2
http://pc8.2ch.net/test/read.cgi/tech/1104898734/
【C++】STL(Standard Template Library)相談室
http://pc5.2ch.net/test/read.cgi/tech/1095583235/
0003デフォルトの名無しさん
2007/08/02(木) 01:54:38入門ページなど
・入門
http://www.jah.ne.jp/~naoyuki/Writings/STL.html
・入門,一覧,使い方
http://www5c.biglobe.ne.jp/~ecb/cpp/07_01.html
・メソッド一覧
http://www.wakhok.ac.jp/~sumi/stl/
・サンプルプログラム集
http://www.s34.co.jp/cpptechdoc/reference/stl_samples/
・TIPS集
http://www.nantekotta.com/stl.html
・メルマガ
http://www.kab-studio.biz/Programing/STLiostream/
・解説
http://ja.wikipedia.org/wiki/Standard_Template_Library
http://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/stl/about_stl.html
マルチスレッドプログラミングの時には
http://www.logos.ic.i.u-tokyo.ac.jp/~yokoyama/trash/stl_thread.html
STLPort
http://www.sgi.com/tech/stl/
http://www.stlport.org/
0004デフォルトの名無しさん
2007/08/02(木) 02:00:43STL標準講座―標準テンプレートライブラリを利用したC++プログラミング
http://www.amazon.co.jp/gp/product/4881357786/
STL―標準テンプレートライブラリによるC++プログラミング 第2版
http://www.amazon.co.jp/gp/product/4894714329/
標準C++:STLの基礎知識
http://www.amazon.co.jp/gp/product/4756138047/
標準講座C++―基礎からSTLを利用したプログラミングまで
http://www.amazon.co.jp/gp/product/4881357050/
STLによるコンポーネントデザイン
http://www.amazon.co.jp/gp/product/475613422X/
Effective STL―STLを効果的に使いこなす50の鉄則
http://www.amazon.co.jp/gp/product/4894714108/
0005デフォルトの名無しさん
2007/08/02(木) 02:02:58Boostを語れゴラァ part4
http://pc11.2ch.net/test/read.cgi/tech/1175663346/
C++0x
http://pc11.2ch.net/test/read.cgi/tech/1149440647/
0006デフォルトの名無しさん
2007/08/02(木) 02:15:51//////////////////////////////////////////////////////////
// 更新履歴
//
// [テンプレに関して]
//
// 2007/08/02
// ・リンク切れのページがあった為、そのリンクを外しました。
// ・書籍、amazonのリンクが長すぎる為、短く変更しました。
//
//////////////////////////////////////////////////////////
0007デフォルトの名無しさん
2007/08/02(木) 02:22:200008デフォルトの名無しさん
2007/08/02(木) 02:33:34お前らも協力しろよ
0009デフォルトの名無しさん
2007/08/02(木) 02:52:27準標準のboostと標準のSTLのスレを統合するのはどうかと思う。
主観やけど難易度としては boost > STL だと思ってるから、
統合したら、STL入門者の居るスレで、boostの新コンポーネントの話はし辛い。
今までどおり、
「std::auto_ptr満足できねー」
「つ boost::shared_ptr」
って流れでいいかと。
0x専用のスレは・・・無くても・・・いいかな。
0010デフォルトの名無しさん
2007/08/02(木) 03:39:43http://pc8.2ch.net/test/read.cgi/tech/1104898734/562
562 名前:デフォルトの名無しさん[sage] 投稿日:2005/05/05(木) 02:58:39
"STL"なんて呼称の範囲は、C++の標準ライブラリに
取り込まれてしまった今となっては明確に区切れる物では無い。
HP STL や SGI STL のことを指して言ってるのかもしれないが、
今使われてるのはそれらをベースにしたC++標準ライブラリだ。
範囲が明確に決まってるかのように、含まれるだの含まれないだの言うのは時代遅れだぞ。
このスレが不要である事に疑いの余地は無い。
0011デフォルトの名無しさん
2007/08/02(木) 05:45:070012デフォルトの名無しさん
2007/08/02(木) 06:06:25まぁお前の考えが下に続いていれば少しは格好もついたけど、
そんなヒステリーじゃ話にならないな。
0013デフォルトの名無しさん
2007/08/02(木) 06:17:45boostってなに?
0014デフォルトの名無しさん
2007/08/02(木) 06:21:260015デフォルトの名無しさん
2007/08/02(木) 06:46:00やっぱ、自分で書いたものをコピペしてたのか
よっぽど、いいこと書いたと思ってんだなw
0016デフォルトの名無しさん
2007/08/02(木) 07:08:49変な電波受信してるんじゃないか?
ヒステリーって言われたのがこたえたのかな。
0017デフォルトの名無しさん
2007/08/02(木) 08:02:10TR1、TR2の話題ならここでもよかろ
0018デフォルトの名無しさん
2007/08/02(木) 09:16:48ごめんなさいもうしませんこたえました。
0019デフォルトの名無しさん
2007/08/02(木) 11:08:080020デフォルトの名無しさん
2007/08/02(木) 13:47:330021デフォルトの名無しさん
2007/08/05(日) 14:03:04vector<T> hoge; // 自作クラスのコンテナ
vector<size_t> fuga; // 上記コンテナの添え字コンテナ
・・・な配列があったとして、以下の処理をループ使わずにやるにはどうすりゃいいですか?
vector<T> result;
for (vector<size_t>::iterator it = fuga.begin(); it != fuga.end(); ++it)
{
result.push_back(hoge[*it]);
}
多分こんな感じになるんじゃなかろうかと思うんだけど、
for_each (fuga.begin(), fuga.end(), ??);
これしきの代入に関数オブジェクト自作して放り込むのも大げさな気がして
予め用意されてる関数とかでサクッとできる方法ってあります?
0022デフォルトの名無しさん
2007/08/05(日) 14:29:120023デフォルトの名無しさん
2007/08/05(日) 14:35:580024デフォルトの名無しさん
2007/08/05(日) 14:40:51typedef vector<T>::reference(vector<T>::*at_t)(vector<T>::size_type);
transform(fuga.begin(),fuga.end(),back_inserter(result),bind1st(mem_fun(static_cast<at_t>(&vector<T>::operator[])),&hoge));
0025デフォルトの名無しさん
2007/08/05(日) 14:41:05ここらへん組み合わせればなんとかなりそう。
transform back_inserter mem_fun vector::operator [] または at
0027デフォルトの名無しさん
2007/08/05(日) 15:00:55分けないで前みたいなC++テンプレートスレみたいにでもすればいいんだ。
23の言っているboost::permutation_iteratorだとこんな感じ。
result.reserve(hoge.size());
std::copy(
boost::make_permutation_iterator(hoge.begin(), fuga.begin()),
boost::make_permutation_iterator(hoge.end(), fuga.end()),
std::back_inserter(result));
0028デフォルトの名無しさん
2007/08/05(日) 15:13:33「何らかの処理施してコピー」なんて解説されてるの読んでピンと来ず。。
「別のコンテナの中身を引っ張ってくる」って処理もアリなわけね。
今回の例みたいな単純な代入だとループに逃げそうになるチキンな俺だが
しかしこれを手がかりに色々と応用試せそうだぜ!おまいら愛してる!
0029デフォルトの名無しさん
2007/08/05(日) 15:20:14STL習いたての時、で画面にprintできる事に感動したなぁ
0030デフォルトの名無しさん
2007/08/05(日) 15:25:10個人的には >>24 みたいなコードあんまり読みたくない・・・
003127
2007/08/05(日) 15:41:570032デフォルトの名無しさん
2007/08/05(日) 15:43:06{
result.push_back(hoge[val]);
}
003321
2007/08/05(日) 16:01:17俺の頭がboostするに違いないと思って手をつけなかったのだが・・・
いい機会だから試してみようかしら。
どう思われる? transformとかもマトモに使いこなせてない俺なわけだが。
今なんか const なメンバ関数を mem_fun に投げ込もうとして
コンパイラに長々と説教頂いておりますよ
0034デフォルトの名無しさん
2007/08/05(日) 16:13:540035デフォルトの名無しさん
2007/08/05(日) 16:15:51003721
2007/08/05(日) 16:36:33もう少しで殴られるとこだったか(・∀・;
今回の例程度の状況ならさっさとループで済ませて次にかかるとしよう
いずれにしても今回教えてもらった事は他の場面で活用するぜ
boostも近いうち試してみる
0038デフォルトの名無しさん
2007/08/05(日) 17:54:48「ループ使ったら負け」とかいう病気
0039デフォルトの名無しさん
2007/08/05(日) 18:06:43メンテは自分だけがやるわけではないし
0040デフォルトの名無しさん
2007/08/05(日) 21:41:380041デフォルトの名無しさん
2007/08/05(日) 22:06:24// ...
って両方のっけとく。
そしてわざわざ1行に下意味をなさなくなる
0042デフォルトの名無しさん
2007/08/05(日) 22:43:27ぐらいなら読める人結構いると思うぜ
0043デフォルトの名無しさん
2007/08/14(火) 01:11:340044デフォルトの名無しさん
2007/08/14(火) 01:57:27書いてある内容を知ってないといろいろ嫌なことが起こるだろうとは言える。
Web 上にも同様の情報はあるので、本が必要なわけじゃない。
0045デフォルトの名無しさん
2007/08/14(火) 11:32:13必要とか不必要とかじゃなく「おすすめの一冊」
0046デフォルトの名無しさん
2007/08/14(火) 14:29:300047デフォルトの名無しさん
2007/08/14(火) 19:25:17template<typename T> void func(std::vector<T> foo)
{
std::vector<T>::iterator it;
}
こういうことをしようとするとerror: expected `;' before "it"になるのだけれど
なんかいい方法はないだろか。要は、forループで使いたいわけだが。
0048デフォルトの名無しさん
2007/08/14(火) 19:28:310050デフォルトの名無しさん
2007/08/16(木) 16:27:03ttp://www5c.biglobe.ne.jp/~ecb/cpp/07_18_03.html
>fill_n void fill( FwdIt first, Size n, const T& x ) firstからn個分の要素をxで満たします。
おいおい、コピペミスにもほどがあるぞ。
ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/algorithm.html#algorithm
>- template<class OutputIterator, class Size, class T>
> void
> fill_n(OutputIterator first,
> Size n,
> const T& value);
あれ? エピたん……
ttp://www.s34.co.jp/cpptechdoc/reference/stl_samples/algorithm.html#std_fill
>- template<class OutputIterator, class Size, class T>
> void
> fill_n(OutputIterator first,
> Size n,
> const T& value);
おやー? しかもここ、エピたんのぺーじにそっくりだけど。
ttp://docs.sun.com/source/819-3704/fil_4628.htm
>template <class OutputIterator, class Size, class T>
> void fill_n(OutputIterator first, Size n, const T& value);
あれ、ここもか。
fill_n()がOutputIteratorを返すってのはローカルな拡張なのか?
ttp://www.informatik.uni-freiburg.de/~danlee/fun/STL-doc/STL/Fill.html
ttp://www.wakhok.ac.jp/~sumi/stl/header/algorithm.html
この辺を初め、OutputIteratorを返すとしているところも多々あるにはあるのだが……
0051デフォルトの名無しさん
2007/08/16(木) 17:31:39template<class OutputIterator, class Size, class T>
void fill_n(OutputIterator first , Size n , const T& value);
005250
2007/08/16(木) 18:05:56すると、1番目は論外として、2-4番目は正解ってことね。
# まぁ、4番目の丸ごとコピー疑惑はあるにしても。
で、5-6番目はgccの拡張を取り上げたのかな?
0053デフォルトの名無しさん
2007/08/16(木) 18:25:07引数が前方反復子だと戻り値がvoidで、出力反復子だと出力反復子になる実装があるのか。
具体的になにが便利でどう使い分けるのかがよく分からないけど…
005450
2007/08/16(木) 18:55:51いや、1番目のは間違いだらけだから無視して。
で、gccの実装はこう。
--
template<typename _OutputIterator, typename _Size, typename _Tp>
_OutputIterator
fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
--
つまり、fill_n()は__first + __nを返す仕様になっている。
0055デフォルトの名無しさん
2007/08/16(木) 19:15:130056デフォルトの名無しさん
2007/08/16(木) 19:19:02eraseで指定された要素を削除する場合、ifで分けて以下のような操作をしなければならないのでしょうか?
なんか、if,elseで分けるところが美しくないのですが、もっと良い書き方があれば教えてください。
std::vector<int> array;
↑には複数の要素があるとする
std::vector<int>::iterator itr;
for (itr = array.begin(); itr != array.end();) {
if (*itr == 5) {
itr = array.erase(itr);
} else
itr++;
}
}
0057デフォルトの名無しさん
2007/08/16(木) 19:20:54これ基本
0058デフォルトの名無しさん
2007/08/16(木) 19:26:01ただのremoveでよくね?
005956
2007/08/16(木) 19:40:08できました。ありがとうございます。
struct Hoge{
int a;
int b;
};
という構造体があり、intのコンテナではなく
std::vector<Hoge>
だった場合、
Hoge構造体のaの値を見て、削除する場合はどうすればいいのでしょうか?
0060デフォルトの名無しさん
2007/08/16(木) 19:51:36↓
if (itr->a == 5)
0061デフォルトの名無しさん
2007/08/18(土) 23:02:48{
return a;
}
0062デフォルトの名無しさん
2007/08/23(木) 23:23:37一瞬惚れそうになったが
intに直接変換できちゃ困るかもしれん。
比較のためだけのクラスを作って、それに変換するってのはどうだ?
(関数オブジェクト作る方がいいんだろうけど)
0063デフォルトの名無しさん
2007/08/24(金) 01:06:12class Parts{
略
}
class A {
Parts* parts;
A(){
parts = new Parts();//コンストラクタで生成して
}
~A(){
delete parts ;//デストラクタで破棄する
}
略
}
というようなクラスがあったとしてそれをvectorに格納したいとき
std::vector<A> vec;
function(){
A a ;
vec.push_back(a) ;
}
とすると、Aクラスのデストラクタが2回呼び出されて
中身の無いポインタをdeleteしてエラーになるようです。
なぜvectorがデストラクタを呼ぶのかなどなぜなのかとどうすればいいか
詳しく解説があるようなところがあれば教えてください。
素人考えでは
やはりSTLの補完としてのBoostのスマートポインタが必要なのでしょうか。
0064デフォルトの名無しさん
2007/08/24(金) 01:14:04vector<>に格納する時にAのコピーコンストラクタが呼ばれるが、
Aではそれが定義されていないので、デフォルトのコピーコンストラクタが
呼ばれ、ポインタメンバのpartsが単にコピーされる。
結果として出来るAのインスタンスは2個だが、どっちもpartsは
同じPartsインスタンスを指しており、それぞれのAが破棄されるときに当然
問題が起きる。
まともに機能するコピーコンストラクタを自分で定義する(この場合は
多分リファレンスカウントを自分で実装することになる)か、
Partsのポインタではなくリファレンスカウント式のスマートポインタを
持つようにするんだな。
0065デフォルトの名無しさん
2007/08/24(金) 01:23:17stlコンテナは常にコピーコピーコピーコピーコピーコピーコピー。
安全にコピーできるオブジェクトでなければコンテナに入れちゃいけない。
慣れてきたらリソースの所有権について常に考えるようにすると良いよ。
0066デフォルトの名無しさん
2007/08/24(金) 01:24:21class A のメンバに
A(const A &x) : parts(new Parts(*x.parts)) {}
を追加するとかそういう意味合いもあったりなかったり
現状の class A 自体が class としての機能を満たしてないから
ちゃんと実装してやった方がおばちゃんモアベターよ
0067デフォルトの名無しさん
2007/08/25(土) 01:51:4164 65 66 のみなさま、
迅速、かつ誘導ではなくこちらでお答えくださってありがとうございます。
なぜpush_back()でデストラクタが呼ばれるかは分かりませんが、
コピーコンストラクタの実装で解決できることを理解できました。
>64
同一のインスタンスでなくてもよかったので(概略からはわかりませんが)
新しくインスタンスを作って値はすべて同じでいちおう動きました。
>65 >コンテナは常にコピー
補足、アドバイスありがとうございました。
>66
STLと別の話になってしまいますが
クラスとしての機能とはどんなものでしょうか。
それが私にはまだ分かっていないので>63のような質問をすることになるのかもしれません。
0068デフォルトの名無しさん
2007/08/25(土) 02:08:28手っ取り早くはboost::shared_ptr使うのがベター
class Parts{
//略
}
class A {
public:
A() : parts_(new Parts) {}
private:
boost::shared_ptr<Parts> parts_;
//略
}
0069デフォルトの名無しさん
2007/08/25(土) 02:12:43RAIIを勉強しなさい。
function()のスコープを出るときにA aが破棄されるのでデストラクタが呼ばれる。
あと、std::vectorはどの時点で内容をコピー&破棄するか判らないので、
function()のスコープの前にデストラクタが呼ばれる可能性もある。
結局のところ、class Aはコンテナに納める要件を満たしてないので入れちゃダメ。
0070デフォルトの名無しさん
2007/08/25(土) 14:06:45using namespace std;
って使わない方がいいって良く言われますけど、
面倒でも std::vector<> って使った方がよいのでしょうか?
0071デフォルトの名無しさん
2007/08/25(土) 14:11:52自分だけで使うことが確定してるヘッダなりプロジェクトなりだったらガンガン使おうがNP
using std::vector;
とかで以後 vector<type> として使えるからごく個人的にはこっちをお勧めしておきたくて愛
0072デフォルトの名無しさん
2007/08/25(土) 14:21:16影響範囲を考えて判断すべし。
・ヘッダ(関数スコープ外): 他のソースにも影響するから避ける
・ソース:全てのヘッダをインクルードした後ならば影響は小さい。
・関数スコープ内:問題なし。問題あったら関数を修正。
なんで、ケースバイケースですな。
0073デフォルトの名無しさん
2007/08/25(土) 14:22:36少なくともヘッダの中で一切スコープで囲ってないとこでやるのは
止めといたほうがいいんじゃね
それがそのままソースにまで取り込まれるからな
自分のnamespaceなり何なりにくるんで、その中で使う分には、まあいいんじゃね
0074デフォルトの名無しさん
2007/08/25(土) 20:19:44ありがとうございました
0075デフォルトの名無しさん
2007/08/30(木) 21:42:59ここで、xの値が特定の範囲内に収まっているもの(30〜50とか)を検索しようとしています。
lower_boundで下限側の検索はうまくできましたが、upper_boundによる上限側の検索がうまくできません。
lower_bound に渡す関数オブジェクトは以下のようにしてうまくいけてるようです。
struct Comp:public binary_function<const data&,const int& ,bool>
{
result_type operator()(first_argument_type prm1,second_argument_type prm2)const
if(prm1.x<prm2)
return true;
return false;
};
upper_bound 側についても上記と同じように書いてみたのですが、コンパイルエラー
などがでます。どのように記述すればよろしいでしょうか。
よろしくお願いします。
0076デフォルトの名無しさん
2007/08/30(木) 23:07:400077デフォルトの名無しさん
2007/08/30(木) 23:24:53同じようにっていうか、それをそのまま渡せばいいんじゃないの?
0078デフォルトの名無しさん
2007/08/30(木) 23:26:14「int<data を書く」とは具体的にはどのようなことなのでしょうか?
よろしくお願いします。
0079デフォルトの名無しさん
2007/08/30(木) 23:28:27>>75は読んでないけど>>76の言ってる意味は
bool operator<(int, const data&) のことでは。
0080デフォルトの名無しさん
2007/08/30(木) 23:42:01low=lower_bound(array.begin(),array.end(),20,Comp());
この場合は正常に取得できます。
以下のようにupper_bound にそのまま渡したのですが
upp=upper_bound(array.begin(),array.end(),30,Comp());
この場合にコンパイルエラーがでてしまいます。
:1番目の引数をconst int からconst struct data& に変換できません。
>>79
bool operator<(int, const data&) を定義して関数オブジェクトを使用
しないほうがいいのでしょうか・・・。
そちらも試してみます。
0081デフォルトの名無しさん
2007/08/30(木) 23:59:16bool operator<(const data&,int) を定義しておけば
lower_bound(array.begin(),array.end(),20)
upper_bound(array.begin(),array.end(),30)で上限下限が取れました。
ですが、場合によってはメンバのyによる範囲検索もしたいので
以下のような関数オブジェクトを指定たいのです。
struct Comp:public binary_function<const data&,const int& ,bool>
{
int m_nType;
Comp(int nType){m_nType=nType;} //1:x比較 2:y比較
result_type operator()(first_argument_type prm1,second_argument_type prm2)const
{
if(m_nType==1)
{
if(prm1.x<prm2)
return true;
return false;
}
else
{
if(prm1.y<prm2)
return true;
return false;
}
}
};
どのようにすればよろしいでしょうか。
よろしくお願いします。
0082デフォルトの名無しさん
2007/08/31(金) 00:33:520083デフォルトの名無しさん
2007/08/31(金) 00:46:140084デフォルトの名無しさん
2007/08/31(金) 18:48:57ご回答、ありがとうございます。
無事解決できました m(__)m。
0085デフォルトの名無しさん
2007/09/05(水) 22:06:05listの行の要素の増加をどういう風にすれば良いのかが分かりません。
list< list<int> > i;
i.pushback(100);
これではエラーが出てしまってできません。
もう一つ。
配列の列の要素の最初と最後の参照はできるのですが、
途中の要素の参照の仕方が分かりません。
list< list<int> >::iterator it = i.begin();
it.***->x = 1000; //***番目のxに1000を格納したい
1次元の配列だと問題ないのですが、2次元だと良く分かりません。
解決できる方、お願い致します。
0086デフォルトの名無しさん
2007/09/05(水) 22:09:030087デフォルトの名無しさん
2007/09/05(水) 22:11:20deque使え
0088デフォルトの名無しさん
2007/09/05(水) 22:54:53ランダムアクセスというかfor文で順次アクセスしたかったんですけどね。
書き方悪かったです。
dequeですか。
ありがとうございます。listに拘りすぎました。
0089デフォルトの名無しさん
2007/09/05(水) 23:16:09typedef std::vector<int> line;
typedef std::vector<line> table;
line l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
table t;
t.push_back(l);
t.push_back(l);
t.push_back(l);
std::cerr << t[1][1] << std::endl;
t[1].push_back(4);
std::cerr << t[1][3] << std::endl;
0090デフォルトの名無しさん
2007/09/06(木) 02:50:07>ランダムアクセスというかfor文で順次アクセスしたかったんですけどね
矛盾してますが何か?
0091デフォルトの名無しさん
2007/09/06(木) 08:56:300092デフォルトの名無しさん
2007/09/08(土) 02:24:40list< list<int> >::iterator it = i.begin();
list<int>::iterator jt = it->begin()
for(int i = 0; i < 500; i++) {jt++;}
*jt = 1000; // 500番目に格納
う、うひぃ。
0093デフォルトの名無しさん
2007/09/08(土) 02:54:020094デフォルトの名無しさん
2007/09/14(金) 19:08:48慣れの問題ですか?
0095デフォルトの名無しさん
2007/09/14(金) 20:34:260096デフォルトの名無しさん
2007/09/15(土) 01:28:14エラーメッセージが頓珍漢で
原因ンが把握しにくいです。
慣れの問題ですか?
0097デフォルトの名無しさん
2007/09/15(土) 01:58:290098デフォルトの名無しさん
2007/09/15(土) 03:34:44このスレの住人うざいです。
脳の問題ですか?
0099デフォルトの名無しさん
2007/09/15(土) 03:51:530100デフォルトの名無しさん
2007/09/15(土) 13:05:16うざければこのスレ開かなければいいだけの話。
お前は馬鹿。
0101デフォルトの名無しさん
2007/09/15(土) 13:17:510102デフォルトの名無しさん
2007/09/15(土) 13:25:450103デフォルトの名無しさん
2007/09/15(土) 13:50:160104デフォルトの名無しさん
2007/09/15(土) 14:40:570105デフォルトの名無しさん
2007/09/15(土) 20:12:19Te
Lu
0106デフォルトの名無しさん
2007/09/15(土) 20:16:400107デフォルトの名無しさん
2007/09/16(日) 00:51:070108デフォルトの名無しさん
2007/09/16(日) 01:17:33「全員にSTL教育しないと読めない奴が出てくるから」って理由で禁止してる現場もあるし、
個人の裁量任せになってる現場もある。
しっかりモジュール分割がされてるプロジェクトだと
ヘッダファイルを読み込むだけだからSTLだろうがBoostだろうが許可されることも。
ちなみに俺のところは、
「コンパイラ付属のライブラリなら、コンパイラ屋がサポート責任を持つからOK」
って事になってる。
(バグ・ドキュメント不備を見つけたらMSにゴルァ)
0109108
2007/09/16(日) 01:19:05「VCのバグを見つけたら」って意味ね
0110108
2007/09/16(日) 01:28:31俺のところは社内で開発したライブラリが結構充実してるので
末端のコーディングでSTLを使う場面があまりない。
まあ、保守を考えたら、
末端があまりに前衛的なコーディングをしてたら嫌がられるだろうな。
Boostはともかく、
STLでも深入りすればそれなりのおつむレベルが要求されるから。
0111107
2007/09/16(日) 01:43:20現場次第なんですね。
うちではあまり使われてないです。
うちの現場はヘポーコなんで
リスト構造とかいちいち自前で作成してるアフォが多くて
0112デフォルトの名無しさん
2007/09/16(日) 02:01:52memset(&(v[0]), 0, v.size())
規格上は問題ないはずだが、これをやるとおかしくなる。
仕事ではSTLの利用は警戒した方がいいと思う。
0113デフォルトの名無しさん
2007/09/16(日) 02:12:24size()の戻り値は要素数じゃね?
memset()の最後の引数はバイト数じゃね?
0114デフォルトの名無しさん
2007/09/16(日) 02:18:18初心者乙
0115デフォルトの名無しさん
2007/09/16(日) 03:40:21v の型は何よ?
0116デフォルトの名無しさん
2007/09/16(日) 04:10:18よっぽど見るに耐えないコーディングしてるんだろうな。
美的センスのないコードはバグの温床になるから嫌い。
0117デフォルトの名無しさん
2007/09/16(日) 11:24:31わからないのを人のせいにしてくる始末。
わからない人でもわかるようにコメント書けとかいってくるw
おまえが勉強しろよって感じ。技術者としてどうよって思う。
0118デフォルトの名無しさん
2007/09/16(日) 11:35:36そうしないと先にすすまないもん
0119デフォルトの名無しさん
2007/09/16(日) 12:17:29ひさびさにバイト長と要素数の間違い犯してる香具師みた。
誰もが一度は犯す過ちだよな…
0120デフォルトの名無しさん
2007/09/16(日) 12:45:11素人にチェーンソー使わせるなんて危なっかしいことしない方が良い。
でも、easy Cとして使えそうなのって他にないんだよな……用途限定でJavaぐらいか。
0121デフォルトの名無しさん
2007/09/16(日) 12:52:38>>119
バイト長とは変わった肩書きだなぁ、とかイミフなことを思ってしまった
0122デフォルトの名無しさん
2007/09/16(日) 13:02:390123デフォルトの名無しさん
2007/09/16(日) 13:12:45ビット長からバイト見習いに上がるまでがきつい
0124デフォルトの名無しさん
2007/09/16(日) 13:17:430125デフォルトの名無しさん
2007/09/16(日) 13:24:370126デフォルトの名無しさん
2007/09/16(日) 17:46:36”会社で使うコンパイラにSTL付属してるけど、他のSTL使ってる”って人はどんくらいいるのかな?
よければ教えて欲しい(なんとなく知りたいだけだから無視してくれてOK)。
うちは、STLPort使ってる。うちの会社の使い方でパフォーマンスよかったから。
0127デフォルトの名無しさん
2007/09/17(月) 02:08:55STLport を使うと早くなるのかなぁ〜
0128デフォルトの名無しさん
2007/09/17(月) 05:03:18#include <iostream>
#include <vector>
#include <algorithm>
void show(int i)
{
std::cout << i << "\n";
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> v;
int i;
for(i=0;i<10;i++){
v.push_back(i);
}
for_each(v.begin(),v.end(),show);
return 0;
}
↑のコードでshowに引数を書いてないのに
iが順番に出力されるのはなぜですか?
0129デフォルトの名無しさん
2007/09/17(月) 05:56:50for_eachが内部でshowを呼んでいるから。
0130デフォルトの名無しさん
2007/09/17(月) 05:59:230131デフォルトの名無しさん
2007/09/17(月) 06:07:390132デフォルトの名無しさん
2007/09/17(月) 08:00:38count() // xをキーに持つ要素の数を返す。
size_type count(const key_type& x) const;
だそうなのですが、そもそも map だと x をキーに持つ
要素の数は高々1なので、count というよりは bool
で済む気がするのですが、これは multimap のことも
考えてのことですか?
0133デフォルトの名無しさん
2007/09/17(月) 09:01:10そのfor_each()は次のコードとほぼ等価だ。
--
for (std::vector<int>::const_iterator it = v.begin(); it != v.end(); ++it) show(* it);
--
ついでに言えば、最適化によって次のコードともほぼ等価になる。
--
for (unsigned ic = 0; ic < ic.size(); ++it) show(v.at(ic));
--
どうでもいいが、C++なのだから変数のスコープはちゃんと意識して書くべきだ。
# 関数の先頭でループ制御変数を宣言するなんて恥ずかしいと知れ。
0134デフォルトの名無しさん
2007/09/17(月) 09:17:05普通に考えて、count という動詞が来たら結果は数だから。
empty なら bool だけど。
0135デフォルトの名無しさん
2007/09/17(月) 09:26:39for_eachの実装はこんな感じ
template <typename In, typename Fun>
Fun for_each(In first, In last, Fun f)
{
for(In it = first; it != last; ++it)
f(*first);
return f;
}
fとしてshowが渡されるわけだから、showを呼ぶときの引数は*it。
itは引数として渡された区間を舐めるイテレータだから、
この場合mainのvの要素を順番に指すことになる。
0136デフォルトの名無しさん
2007/09/17(月) 09:29:19STL の標準版アルゴリズム群で map を操作するのは効率が悪いので、
map 専用版も用意することになった。同じアルゴリズムには同じ名前を
使いたいので count もそのまま残った、ということでしょう。
0137デフォルトの名無しさん
2007/09/17(月) 10:13:47配列の中身に0から9の値が順に格納されているから。
それを順に取り出して表示しているので、0から9の値が順に表示されるというだけ。
0138128
2007/09/17(月) 14:38:18ありがとうございました
0139デフォルトの名無しさん
2007/09/17(月) 16:06:52もっと便利なコンテナも登場するの?
0140デフォルトの名無しさん
2007/09/17(月) 16:19:21とか言われるとboost厨uzeeとか言われるんだだろうなぁ
0141デフォルトの名無しさん
2007/09/17(月) 16:47:53念願のハッシュとかあるぜよ
0142デフォルトの名無しさん
2007/09/17(月) 17:22:180143デフォルトの名無しさん
2007/09/17(月) 18:20:14スタックに積まれるのは文字列全部ですか?
0144デフォルトの名無しさん
2007/09/17(月) 18:30:04スタックにはクラス本体だけ。
文字列自体はヒープに確保される。
0145デフォルトの名無しさん
2007/09/17(月) 19:28:52C++0xでコンセプトが導入される予定なので
次期or次々期のSTLは全体的に書き換わるのではないかといわれている。
0146デフォルトの名無しさん
2007/09/17(月) 19:31:11HaskellはC++のサブセットになります
0147デフォルトの名無しさん
2007/09/17(月) 19:39:090148デフォルトの名無しさん
2007/09/17(月) 21:55:12じゃ、 const std::string& で引数をとるのはあんまり意味ないかな?
0149デフォルトの名無しさん
2007/09/17(月) 22:04:35複製する実装も少なくない(下手したらこっちが主流かもしれない)だろうから、
依然としてconst参照にすべきだと思う。俺はそうしている。
0150デフォルトの名無しさん
2007/09/17(月) 22:37:41参照ならアドレス渡すだけだけど、値渡しなら、コピーコンストラクタが呼ばれるんじゃね?
文字列本体をヒープにもってて、参照カウンタをもってるような実装でも。
0151デフォルトの名無しさん
2007/09/17(月) 22:46:58コピーコンストラクタは文字通りコピーを作るんじゃないかな。(それが目的だと思っている)
だからconst参照を選ぶ。
0152デフォルトの名無しさん
2007/09/18(火) 01:35:10> どうでもいいが、C++なのだから変数のスコープはちゃんと意識して書くべきだ。
どうでもいいが、VC6だと変数のスコープがブロックの外になっちまうんだよな…
0153デフォルトの名無しさん
2007/09/18(火) 01:55:12いいえ。ブロックの外になることはありません。
0154デフォルトの名無しさん
2007/09/18(火) 02:19:06釣り?
0155デフォルトの名無しさん
2007/09/18(火) 07:42:47for (int i = 0; i < N; ++i) func(i);だったらそもそもブロックなんかないわけだし。
0156デフォルトの名無しさん
2007/09/18(火) 09:45:570157デフォルトの名無しさん
2007/09/18(火) 09:51:55>>152の言わんとしている事に気づいてない様子だね
0158デフォルトの名無しさん
2007/09/18(火) 09:56:210159デフォルトの名無しさん
2007/09/18(火) 10:03:40何に気づいてるって?
0160デフォルトの名無しさん
2007/09/18(火) 10:13:10>>152の言わんとしている事
0161デフォルトの名無しさん
2007/09/18(火) 10:25:10>>152の言わんとしている事って何?
0162デフォルトの名無しさん
2007/09/18(火) 10:41:01cout << i; // ここでiが見えることだろ
0163デフォルトの名無しさん
2007/09/18(火) 10:41:260164デフォルトの名無しさん
2007/09/18(火) 19:46:28これで解決するかな?
0165デフォルトの名無しさん
2007/09/18(火) 19:54:580166デフォルトの名無しさん
2007/09/18(火) 20:10:51たまたま偶然見えてるように見えてるんじゃないの?
deleteやfreeで解放しても、しばらくは見えてるのと同じ理由だと思うの...
0167デフォルトの名無しさん
2007/09/18(火) 20:28:20それだと後ろにelse ifが続いたとき対応がおかしくなる。
>>166
ちがうよ。
VC6は本当にスコープが外れない。
0168デフォルトの名無しさん
2007/09/18(火) 20:42:08有効範囲(scope)と生存期間(extent)を区別しろよ。
構文的な有効範囲の外では名前自体が使えない(コンパイル時エラーになるべき)のであって、
寿命の尽きたオブジェクトを参照するのとは話が違う。
0169デフォルトの名無しさん
2007/09/18(火) 21:08:53それググったら出て来たやつだね
0170デフォルトの名無しさん
2007/09/18(火) 21:53:03>for (int i = 0; i < N; ++i) func(i);
これって「暗黙のブロック」みたいな言い方しないっけ?
>>152
>>162の様なソースの外側のブロックでiが別の定義されてないか?
0171デフォルトの名無しさん
2007/09/18(火) 22:22:350172デフォルトの名無しさん
2007/09/18(火) 22:22:50言う。
けど、for内で宣言した変数が162のように外側でも見えるVC++ 6やARMだと、
forは暗黙のブロックを作らないのではないのかと思う。
そして、ISO C++ではforも暗黙のブロックを作る対象になっている (§6.4)。
(確かめたのはJIS X3014なんだけどさ)
ARMは今手元にないからわからない。
0173デフォルトの名無しさん
2007/09/18(火) 22:38:27VC8からはデフォルトで7.1はオプションだったのは覚えてる
0174デフォルトの名無しさん
2007/09/18(火) 22:44:56標準ライブラリもまともに使えないと聞いたことがある。
自分で試したのではないけど。
0175デフォルトの名無しさん
2007/09/18(火) 23:22:33#include <stdio.h>
void main()
{
for( int i = 0; i < 10 ; i++ )
printf( "%d", i );
for( int i = 0; i < 10 ; i++ ) //2重定義でエラーの出るコンパイラがある
printf( "%d", 10 - i );
}
0176デフォルトの名無しさん
2007/09/18(火) 23:32:02そそ。VC6だとエラーになる。
0177デフォルトの名無しさん
2007/09/19(水) 02:11:25配列の大きさ気にしなくていいので楽ですね。
便利な関数もいろいろあって役に立ちそうです。
なにを今さらなことなんですけどw
0178デフォルトの名無しさん
2007/09/19(水) 02:53:37ファンクタ関連の貧弱さに怒れるようになって初めて一人前。
精進せい。
0179デフォルトの名無しさん
2007/09/19(水) 03:18:06最初はvectorだけ使うとかで
そのうち色んな順番でソートしたいとか連想配列使いたいとか欲求がでてきて
>>178
になってboostへ
0180デフォルトの名無しさん
2007/09/19(水) 04:53:54今ではどっぷり浸かってます。
0181デフォルトの名無しさん
2007/09/19(水) 07:58:340182デフォルトの名無しさん
2007/09/19(水) 09:20:402. 関数型言語を知って狂喜します。
3. コンパイル時計算が書けないことに絶望します。
4. Lispのマクロを知って狂喜します。
5. 型をベースにした計算ができないことに絶望します。
6. もう逃げ場がないので、自ら命を絶ちます。
0183デフォルトの名無しさん
2007/09/19(水) 10:57:580184デフォルトの名無しさん
2007/09/19(水) 12:27:170185デフォルトの名無しさん
2007/09/19(水) 13:50:49Dも既に十分すぎるぐらいに複雑な変態言語だが、それでもC++よりはずっと簡潔に
コンパイル時計算が出来る
template factorial(int n)
{
static if (n == 1)
const factorial = 1;
else
const factorial = n * factorial!(n-1);
}
0186デフォルトの名無しさん
2007/09/19(水) 15:11:360187デフォルトの名無しさん
2007/09/19(水) 19:07:06ナウだね。ナウい。
0188デフォルトの名無しさん
2007/09/19(水) 19:19:19あんどりゅ・あれきさんどれすく
0189デフォルトの名無しさん
2007/09/20(木) 00:08:360190デフォルトの名無しさん
2007/09/20(木) 00:22:13std::bind1st類とboost::bindといった具合に、
機能が完全に重複することは、ないわけではないが稀。
ただし、こういう場合は間違いなくBoostのほうがベター。
0191デフォルトの名無しさん
2007/09/20(木) 00:50:110192デフォルトの名無しさん
2007/09/20(木) 07:54:500193デフォルトの名無しさん
2007/09/20(木) 13:23:19その間別の事すればいいだけだし
プリコンパイルヘッダ使えばその時間も短縮される
0194デフォルトの名無しさん
2007/09/20(木) 14:03:01STLとかコンパイル断然速くなるよ
0195デフォルトの名無しさん
2007/09/20(木) 21:57:50デバッグビルドで最適化しないのは当然だろ。
0196デフォルトの名無しさん
2007/09/20(木) 22:10:32事がありませんが、STL と比べるとどうなんでしょうか?
全部読んでないのですが、皆さんはテンプレート機能を使って、
新規にテンプレートクラスを制作しているのでしょうか?
0197デフォルトの名無しさん
2007/09/21(金) 09:23:50ファンクタやら独自コンテナやらを自分で書ける奴は多くなさそうだ。
0198デフォルトの名無しさん
2007/09/21(金) 10:31:53デフォルトコンストラクタがなければだめなんですよね?
0199デフォルトの名無しさん
2007/09/21(金) 10:37:160200デフォルトの名無しさん
2007/09/21(金) 11:22:51サイズ指定のみのコンストラクタ、サイズ指定のみの resize() 、 map の operator [] () の
どれも使わないのであれば必要ない。
むしろコピーコンストラクタとコピー代入演算子のほうが広く必要とされる。
0201デフォルトの名無しさん
2007/09/21(金) 16:25:08なるほど。
○○のコンテナに入れるなら、あるいは○○の機能を使うなら
○○を満たしていなければならない、みたいな取り決めを知るには
やっぱり正式な仕様書を読まなければなりませんか?
今のところコンパイラが出すわかりにくいテンプレートがらみの
エラーメッセージ見ながら、「う〜ん、このテンプレートで
エラーが出てるんだからこれができなくって怒られてるんだろうなぁ」
とか推測しながらやってます。
0202デフォルトの名無しさん
2007/09/21(金) 17:04:02今はそうするしかない(将来的にはソース上に書き下せるようになりそう)。
テンプレート引数に要求される事柄は、
一般にコンセプト (concept)とか要件 (requirement)と呼ばれる。
C++の規格書であるJIS X 3014は、ttp://www.jisc.go.jpで見れる。
0203デフォルトの名無しさん
2007/09/22(土) 13:02:400204デフォルトの名無しさん
2007/09/22(土) 13:07:210205デフォルトの名無しさん
2007/09/22(土) 14:35:260206デフォルトの名無しさん
2007/09/22(土) 15:06:180207デフォルトの名無しさん
2007/09/22(土) 18:23:010208デフォルトの名無しさん
2007/09/22(土) 22:25:05言語を普及させるつもりないのかな
0209デフォルトの名無しさん
2007/09/22(土) 22:33:480210デフォルトの名無しさん
2007/09/22(土) 23:01:02言語をというより、規格全般じゃない?
0211デフォルトの名無しさん
2007/09/22(土) 23:43:330212デフォルトの名無しさん
2007/09/23(日) 01:04:230213デフォルトの名無しさん
2007/09/23(日) 04:38:550214デフォルトの名無しさん
2007/09/23(日) 08:20:53完全に独立採算な団体なの?
0215デフォルトの名無しさん
2007/09/23(日) 08:28:010216デフォルトの名無しさん
2007/10/02(火) 08:30:45コンテナの中身も削除してくれますか?
0217デフォルトの名無しさん
2007/10/02(火) 08:31:520218デフォルトの名無しさん
2007/10/02(火) 08:41:260219デフォルトの名無しさん
2007/10/02(火) 08:43:55スマートポインタを使いましょう
0220デフォルトの名無しさん
2007/10/02(火) 09:11:550221デフォルトの名無しさん
2007/10/02(火) 09:30:05コンテナに使用する場合は全適用しちゃっていいでしょう
ただしstd::auto_ptrはリソースを共有する際問題になることがあるので控えましょう
effective C++第三版の3章にわかりやすい説明がありますのでそこを読むと良い解が得られるかもしれません
0222デフォルトの名無しさん
2007/10/02(火) 09:36:090223デフォルトの名無しさん
2007/10/02(火) 09:42:330224デフォルトの名無しさん
2007/10/02(火) 09:45:43無いと困る。
serialization とか shared_ptr とか特に。
0225デフォルトの名無しさん
2007/10/02(火) 09:54:190226デフォルトの名無しさん
2007/10/02(火) 10:12:38ほんとにリリースできるのか不安になる
0227デフォルトの名無しさん
2007/10/02(火) 11:05:01STL の話? Boost の話?
0228デフォルトの名無しさん
2007/10/02(火) 11:05:480229デフォルトの名無しさん
2007/10/02(火) 17:56:06どうすればいいの?コンセプトチェックは boost::concept_check
使うとして、どのコンテナに入れるにはどのコンセプトを満たして
いなければならないってのはどこにリストがあるの?
SGI のドキュメント嫁?
0230デフォルトの名無しさん
2007/10/02(火) 18:11:44http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
0231デフォルトの名無しさん
2007/10/02(火) 18:34:16いっぱい std::ifstream 開いておいて
foo (std::vector<std::istream>& streams) {
.....
}
みたいにして渡すのは邪道?そもそもストリーム自体を
コピーしたりしていいんだろうか、という疑問もある。
0232デフォルトの名無しさん
2007/10/02(火) 18:40:470233231
2007/10/02(火) 18:43:18std::vector<boost::shared_ptr<std::istream>>
渡すことにしました。
0234デフォルトの名無しさん
2007/10/02(火) 18:49:40残念ながら、std::istreamは
AssignableでもCopyConstractableでもないので複製できない。
0235デフォルトの名無しさん
2007/10/07(日) 14:01:180236デフォルトの名無しさん
2007/10/07(日) 15:28:44FILE*のようにストリームを変数に入れておこうという考えを
持つのはごく自然なことで、
std::streamがコピー可能であることを知らない初心者がはまる
ありがちな罠なんじゃないの
0237デフォルトの名無しさん
2007/10/07(日) 17:41:35だからコピー可能ではないと思うのだが。
0238デフォルトの名無しさん
2007/10/07(日) 19:17:54「コピー不可能であることを」
のタイポかな
0239デフォルトの名無しさん
2007/10/07(日) 19:25:080240デフォルトの名無しさん
2007/10/08(月) 03:43:31foreachするしかないでしょうか?
0241デフォルトの名無しさん
2007/10/08(月) 03:48:46map< string , map::iterator > という手もあるかもね。
0242デフォルトの名無しさん
2007/10/08(月) 03:49:50kwsk
0243デフォルトの名無しさん
2007/10/08(月) 03:51:45string をキーとした検索用の map を追加で用意するってこと。
もちろん更新は必ず同時に行う必要があるから、それらを包むクラスを
作ることになる。
面倒だから、検索速度に不満がなければループまわして探しとけ。
0244240
2007/10/08(月) 04:04:12早速にありがとうございます。
int key = hoge["hogehoge"]->first;
ということですね。 やはり専用関数は無いも
のなんですね。(重複とか面倒そうですもんね)
map2本立てで検討したいと思います。
0245デフォルトの名無しさん
2007/10/08(月) 14:06:53boost::multi_index_container
0246デフォルトの名無しさん
2007/10/08(月) 17:04:56分割しなければ問題ありません。非常に単純なプログラムでも、テンプレートがあるだけで、
リンクに失敗します。対処方法を教えてください。
0247デフォルトの名無しさん
2007/10/08(月) 17:18:250248デフォルトの名無しさん
2007/10/08(月) 17:18:48または、現象を再現させる最小のコードを貼れ。
0249デフォルトの名無しさん
2007/10/08(月) 18:12:310250デフォルトの名無しさん
2007/10/08(月) 20:48:270251デフォルトの名無しさん
2007/10/08(月) 20:50:420252デフォルトの名無しさん
2007/10/08(月) 21:08:180253デフォルトの名無しさん
2007/10/11(木) 01:44:40list使ってみたら添え字でアクセスできないのが
思った以上に不便に感じた('A`)
0254デフォルトの名無しさん
2007/10/11(木) 01:49:42vector 使っとけ
0255デフォルトの名無しさん
2007/10/11(木) 01:50:300256デフォルトの名無しさん
2007/10/11(木) 02:07:18list に要素本体格納して vector にそれへのポインタ入れとけ
0257デフォルトの名無しさん
2007/10/11(木) 02:10:240258デフォルトの名無しさん
2007/10/11(木) 02:12:40__,,. --─'──`<.,,/:::::::ト、
,. '" `'く:::::::ト.
∧ / ゝ____,.へ--、へr-、ノ i、::::! | /!
V i__,.へ!_,./--'─'--'-<ヽi__/ Y | /」
__i. r'へ,.イ / ハ ハ i `ヽ7、.| .|/
∠__,.ヘ `Y´ / / ハ__/,.ィ レ' レヘ、_!_ i iヘ| |<>
/iヽ. i イハ /i rr--'テ ,r-テiレヘ i | |
!/ !., | V :| ゞ-' ヽ' ハ ハノ| |> いくらこのスレでも許容限度があると思う。
∧ `ヽ、ノ 〈 ハ " "从ヽレi. |
V /!〈rヘハ!|`ヽ、.,_ ´ _,,.イハ ハ〉 レ'
|/ / レ/´ ̄`ヽニ7´ト、!/ Vヽ>
!/〈 `ヽムi i/
ヽ_r、_イヘノハi_,.r〉
i:::ヘ ',:::::/ /
,.rく::/::ハ ヽ7 /ト、
,r<:::::::ヽ::〉 i/イ_:::\、
ri ´ ̄ ̄7 ̄7'^ヽ'ヽ. `iヽ、
くL!、.,______,,.l____i, i i_ノ_ノ::>
ヽ-'^ー'  ̄
0259デフォルトの名無しさん
2007/10/11(木) 19:52:310260デフォルトの名無しさん
2007/10/12(金) 00:34:360261デフォルトの名無しさん
2007/10/12(金) 00:38:460262デフォルトの名無しさん
2007/10/12(金) 00:44:40実際、双方向リストを拡張してランダムアクセスに比較的強いデータ構造を作ることもできるはずだし。
STLにはないけど。
0263デフォルトの名無しさん
2007/10/12(金) 00:52:140264デフォルトの名無しさん
2007/10/12(金) 03:02:350265デフォルトの名無しさん
2007/10/12(金) 03:34:160266デフォルトの名無しさん
2007/10/12(金) 07:26:280267デフォルトの名無しさん
2007/10/12(金) 07:44:200268デフォルトの名無しさん
2007/10/12(金) 08:16:42両進イテレータでアクセスできるとか、
最悪でも線形時間で処理が終わるとか
そういう言い方で規定してるような。
だから、内部的にhashを持つlist実装も不可ではないはずだ。
常識的にはtreeで実装するがな
0269デフォルトの名無しさん
2007/10/12(金) 08:48:44iterateしながらの挿入削除といった操作に対して弱くなりそうだが
0270デフォルトの名無しさん
2007/10/12(金) 10:53:23map はソート済みシーケンスになる必要があるから、ハッシュは使えないと思う。
0271デフォルトの名無しさん
2007/10/12(金) 11:44:11ユーザが勝手に作ったクラスとかどうするんだ
0272デフォルトの名無しさん
2007/10/12(金) 11:47:19hash計算関数を書かせればいいと思いまーす
0273デフォルトの名無しさん
2007/10/12(金) 11:54:52それは std::map に
任意の型のキーに対して比較演算できないだろう
ユーザが勝手に作ったクラスとかどうするんだ
って言うようなもんだぜ。
0274デフォルトの名無しさん
2007/10/12(金) 12:12:17std::map はコンストラクタで比較用の関数オブジェクトを指定する仕様だから、それを使うに決まっている
0275デフォルトの名無しさん
2007/10/12(金) 12:26:280276デフォルトの名無しさん
2007/10/12(金) 12:46:030277273
2007/10/12(金) 12:56:43それは知ってる。
hash 関数も同じようにできるから >>271 はおかしいって話。
デフォルトの less みたいなのが決められないってのが、かつて
規格に含まれなかった理由かな?
0278デフォルトの名無しさん
2007/10/12(金) 20:18:46keyがintでもhash値計算し直すの?
0279デフォルトの名無しさん
2007/10/12(金) 23:05:180280デフォルトの名無しさん
2007/10/13(土) 01:48:37クラステンプレート std::hash が標準で提供されて、デフォルトだとそれ使う。
20.5.15 Class template hash [unord.hash]
1 The unordered associative containers defined in clause 23.4 use specializations of hash as the default hash function.
This class template is only required to be instantiable for integer types (3.9.1), floating point types (3.9.1), pointer
types (8.3.1), and std::string, std::u16string, std::u32string, and std::wstring.
0281デフォルトの名無しさん
2007/10/13(土) 12:31:550282デフォルトの名無しさん
2007/10/13(土) 13:40:550283デフォルトの名無しさん
2007/10/13(土) 15:57:430284デフォルトの名無しさん
2007/10/13(土) 15:59:49intの値に変換するときにコンパイラに怒られるのが嫌
0285デフォルトの名無しさん
2007/10/13(土) 16:07:40そういう使い方して良いのかな?
わざわざ怒られるくらいだからしない方が良い?
0286デフォルトの名無しさん
2007/10/13(土) 16:10:580287デフォルトの名無しさん
2007/10/13(土) 16:32:53コンパイラに怒られることが問題なんじゃあない
0288デフォルトの名無しさん
2007/10/13(土) 18:41:300289デフォルトの名無しさん
2007/10/13(土) 18:51:000290デフォルトの名無しさん
2007/10/13(土) 18:53:54static_cast で十分だろ。許さない。
0291デフォルトの名無しさん
2007/10/13(土) 19:28:26static_castだけでは不十分だ。
0292デフォルトの名無しさん
2007/10/13(土) 19:31:55いつの間にポインタの話に・・・まあいいけど。
可能ならローカルなコピーを渡せ。それがダメなら const_cast しろ。
Cスタイルキャストは許さない。
0294デフォルトの名無しさん
2007/10/13(土) 20:14:040295デフォルトの名無しさん
2007/10/13(土) 20:29:140296デフォルトの名無しさん
2007/10/13(土) 21:07:040297デフォルトの名無しさん
2007/10/14(日) 01:32:05みんなはどういう名前にしてる?
0298デフォルトの名無しさん
2007/10/14(日) 01:33:420299デフォルトの名無しさん
2007/10/14(日) 01:33:450300デフォルトの名無しさん
2007/10/14(日) 01:55:290301デフォルトの名無しさん
2007/10/14(日) 01:59:47でも k までネスト構造を作るのは気持ち悪いから実際には j までしか行かないな、関係ないけど。
0302デフォルトの名無しさん
2007/10/14(日) 02:18:12ベクタのときはit_v
ってやってた
0303デフォルトの名無しさん
2007/10/14(日) 02:20:51変数名は使用目的に合わせてつけろよ。型じゃなくてさ。
単純なループ用なら int i, j, k, ... でいいけど。
0304デフォルトの名無しさん
2007/10/14(日) 03:30:04もちろん
iterator
0305デフォルトの名無しさん
2007/10/14(日) 04:07:500306デフォルトの名無しさん
2007/10/14(日) 04:51:21イテレータはたいてい登録できないぞ
0307デフォルトの名無しさん
2007/10/14(日) 05:48:340308デフォルトの名無しさん
2007/10/14(日) 17:51:06このリストから、foo::isInvalidがTRUEの要素だけを削除したいと思います。
次のように実装してみたのですが、クラッシュしてしまいます。
std::list<foo*>::iterator it;
for(it = mylist.begin() ; it != mylist.end() ; ++it)
{
foo * p = (foo *)(*it);
if(p->isInvalid)
{
mylist.erase(it);
delete p;
continue;
}
}
そこでmylist.erase()したら、itをmylist.begin()で初期化するようにしたところ
クラッシュしなくなりました。
もしかしてリストから要素をeraseすると、イテレータは無効になるのでしょうか?
0309デフォルトの名無しさん
2007/10/14(日) 17:54:220310デフォルトの名無しさん
2007/10/14(日) 17:57:47> もしかしてリストから要素をeraseすると、イテレータは無効になるのでしょうか?
あたりまえだろ。
0311デフォルトの名無しさん
2007/10/14(日) 17:59:18あ、なるほど。。戻り値が新しい有効なイテレータなんですね。。
勉強になりました。ありがとうございます。
0312デフォルトの名無しさん
2007/10/14(日) 18:00:59std::list::remove_if() 使えば?
これぐらいなら標準のファンクタでいけるだろ。
0313312
2007/10/14(日) 18:01:460314デフォルトの名無しさん
2007/10/14(日) 18:02:23典型的O(n^2)処理にワロタ
0315308
2007/10/14(日) 18:02:41std::list<foo*>::iterator it;
for(it = mylist.begin() ; it != mylist.end() ; ++it)
{
foo * p = (foo *)(*it);
if(p->isInvalid)
{
it = mylist.erase(it);
delete p;
if(it == mylist.end())
{
break;
}
}
}
みなさんならどうしますか?
0316デフォルトの名無しさん
2007/10/14(日) 18:02:54> foo * p = (foo *)(*it);
こういうキャストやめてくれよ。
0317デフォルトの名無しさん
2007/10/14(日) 18:03:230318デフォルトの名無しさん
2007/10/14(日) 18:18:56なんでキャストが要るんだ?
まぁそれでいいと思うが、俺ならstd::list<boost::shared_ptr<foo> > にしてdeleteはしないな。
0319デフォルトの名無しさん
2007/10/14(日) 18:22:45for(std::list<foo*>::iterator it = mylist.begin();
it != mylist.end();)
{
foo * p = *it;
if(p->isInvalid) {
mylist.erase(it++);
delete p;
} else {
it++;
}
}
これでどうよ。eraseがiteratorを返さないコンテナでもOK。
0320デフォルトの名無しさん
2007/10/14(日) 18:22:58それだとinvalidなのが連続したときに二番目を逃すことになる
eraseしなかったときだけ++itするべし
0321デフォルトの名無しさん
2007/10/14(日) 18:24:580322デフォルトの名無しさん
2007/10/14(日) 18:28:15たぶん>>314へのレスじゃね?
0323デフォルトの名無しさん
2007/10/14(日) 18:28:47なるほど。僕もそれで行くことにします。
>>320
あ、そうですね。。忘れてました。。
>>316
そうですよね。。でもそうしないとインテリセンスが反応してくれないのでつい。。
皆さんありがとうございました(^-^)
0324デフォルトの名無しさん
2007/10/14(日) 18:52:39それvectorに適用しようとするとひどいことになるぞ
0325デフォルトの名無しさん
2007/10/14(日) 19:04:120326デフォルトの名無しさん
2007/10/14(日) 19:13:370327デフォルトの名無しさん
2007/10/14(日) 20:09:120328デフォルトの名無しさん
2007/10/15(月) 00:58:16うちの職場だと使ってるやつ数人だよ
存在も知らないやつも多い気がする
うちがレベル低いだけですかそうですか
0329デフォルトの名無しさん
2007/10/15(月) 00:59:220330デフォルトの名無しさん
2007/10/15(月) 01:00:570331デフォルトの名無しさん
2007/10/15(月) 02:51:47もう流行るとかいう段階を越えて、常識と化している。
・・・はずなんだけど、そういう職場の例はしょっちゅう出てくるね。
0332デフォルトの名無しさん
2007/10/15(月) 03:10:340333デフォルトの名無しさん
2007/10/15(月) 06:34:32iter
ite
it
i
ネストが深くなるにつれて名前が短くなる
0334デフォルトの名無しさん
2007/10/15(月) 07:02:14itr_end
itr_i
itr_j
itr_k
....
の俺は少数派ですか?
0335デフォルトの名無しさん
2007/10/15(月) 09:08:574段以上のときはどうするの?
逆にした方が文字数でネストの深さがすぐに分かって良いかもね
0336デフォルトの名無しさん
2007/10/15(月) 19:02:320337デフォルトの名無しさん
2007/10/16(火) 01:41:08読んでるやついる?
つーか常識?
0338デフォルトの名無しさん
2007/10/16(火) 02:55:510339デフォルトの名無しさん
2007/10/16(火) 09:28:04double_freeで落ちてしまったので、いろいろ調べ始めたのですが
要素数がないときはどのような動作をするものなのでしょうか?
環境によって動作が変わったりするものなのでしょうか?
要素数チェックを含んでいるかどうかを調べようと思ったのですが
これといったドキュメントを見つけられませんでした。
0340デフォルトの名無しさん
2007/10/16(火) 09:54:48で、eraseについては、「有効な」イテレータqに対して、a.erase(q)の意味が定められてる。
aが空の時はa.begin()は有効なイテレータを返さないから、a.pop_front()の意味は規定されてないことになる。
0341デフォルトの名無しさん
2007/10/16(火) 10:09:38ありがとうございました。
0342デフォルトの名無しさん
2007/10/17(水) 12:57:49要求したメモリを確保できなければ例外が発生するのですか?
0343デフォルトの名無しさん
2007/10/17(水) 13:31:150344デフォルトの名無しさん
2007/10/17(水) 13:38:32すんまそん、なんつー例外が発生するんでしょうか?
std::runtime_error の派生クラスだと思うんですが・・
0345デフォルトの名無しさん
2007/10/17(水) 13:43:220346デフォルトの名無しさん
2007/10/17(水) 18:24:250347デフォルトの名無しさん
2007/10/17(水) 18:52:130348デフォルトの名無しさん
2007/10/17(水) 20:29:420349デフォルトの名無しさん
2007/10/17(水) 21:04:310350デフォルトの名無しさん
2007/10/17(水) 21:28:210351デフォルトの名無しさん
2007/10/17(水) 22:09:250352デフォルトの名無しさん
2007/10/17(水) 22:13:520353デフォルトの名無しさん
2007/10/17(水) 23:12:370354デフォルトの名無しさん
2007/10/17(水) 23:18:06明確な定義がない以上どこまでがSTLかの境界を定めようとするのが不毛ってだけで
0355デフォルトの名無しさん
2007/10/17(水) 23:39:59だよね!
0356デフォルトの名無しさん
2007/10/17(水) 23:40:260357デフォルトの名無しさん
2007/10/17(水) 23:46:03いずれboostがSTLの範疇になるの日がくる……かも
0358デフォルトの名無しさん
2007/10/17(水) 23:50:380359デフォルトの名無しさん
2007/10/18(木) 00:07:33エラーが出ると何がなんだかさっぱり解らん
0360デフォルトの名無しさん
2007/10/18(木) 00:23:140361デフォルトの名無しさん
2007/10/18(木) 00:38:320362デフォルトの名無しさん
2007/10/18(木) 00:56:04でもboostからC++に入ったのでやめられません
0363デフォルトの名無しさん
2007/10/18(木) 02:14:310364デフォルトの名無しさん
2007/10/18(木) 02:28:38Boostは三日で慣れる
0365デフォルトの名無しさん
2007/10/18(木) 09:03:360366デフォルトの名無しさん
2007/10/18(木) 09:16:49bootsスレに行け。
0367デフォルトの名無しさん
2007/10/18(木) 15:24:27bitset … 何それ?(固定長ならビットフィールドで十分)
0368デフォルトの名無しさん
2007/10/18(木) 16:02:07C++0xの新機能を使って書き直して
リニューアル/パワーアップするとかないのかな…
0369デフォルトの名無しさん
2007/10/18(木) 21:01:430370デフォルトの名無しさん
2007/10/21(日) 05:19:09やはりvectorがそうであるように挿入を繰り返すと大量の領域があらかじめ確保されてしまうんでしょうか。
1万件を超える数の要素を操作するから利用を躊躇う。
0371デフォルトの名無しさん
2007/10/21(日) 07:02:120372デフォルトの名無しさん
2007/10/21(日) 10:39:55想像で「躊躇う」とか言ってないで、自分のケースで実際にまずいかどうかは
実測して判断したら?
まずいようなら、Berkeley DBのようなものを使えばいいでしょ
0373デフォルトの名無しさん
2007/10/21(日) 17:41:48resultを戻り値にしたいのですが、プロトタイプは、どのように宣言したらいいですか
0374デフォルトの名無しさん
2007/10/21(日) 17:48:41vector<int> foo();
0375デフォルトの名無しさん
2007/10/21(日) 17:52:38とあるけど、ほかの標準ライブラリってたとえば何があるの?
0376デフォルトの名無しさん
2007/10/21(日) 17:55:460377デフォルトの名無しさん
2007/10/21(日) 18:00:00広い意味ではC++のライブラリに含めるかもだけど
普通はCのライブラリだから 標準とはちっと違う気がします
0378デフォルトの名無しさん
2007/10/21(日) 18:06:46日本語理解してくれてありがd
ほんまやね、適当に関数定義と宣言してもコンパイラ通りますやん
vector<int> foo();
vector<int> foo()
{
vector<int> result;
return result;
}
0379デフォルトの名無しさん
2007/10/21(日) 18:10:39なにが疑問なのかさっぱりわからんが、コピーを戻していることを忘れるなよ。
vector<int>* foo();
とか
boost::shared_ptr<vector<int> > foo();
とできないか、よく考えとけ。
0380デフォルトの名無しさん
2007/10/21(日) 18:10:48IOストリームはSTLじゃない。stringもSTLコンテナとして使えるがSTLではない。
C++固有のライブラリならこのくらいかな…?
標準例外クラスもかな?
0381デフォルトの名無しさん
2007/10/21(日) 18:21:110382デフォルトの名無しさん
2007/10/21(日) 18:25:390383デフォルトの名無しさん
2007/10/21(日) 18:27:210384デフォルトの名無しさん
2007/10/21(日) 18:32:150385374=379
2007/10/21(日) 18:36:23http://hiro.asks.jp/20193.html
ひろゆき大先生のパターン2に従っただけさ
0386デフォルトの名無しさん
2007/10/21(日) 18:39:14特定の選択肢を押し付けようと必死になってるように見える
まあつまらんことだが
0387デフォルトの名無しさん
2007/10/21(日) 18:40:390388デフォルトの名無しさん
2007/10/21(日) 18:44:36>>378でも>>379でもないが、俺もvector<>のコピーを戻すという設計は
正直コスト的に気になる。
>>379は(口は悪いが)それを親切に指摘しているだけに見えるよ。
まあ俺ならまっさきに考えるのは、古き良き引数での参照渡しだけれども。
0389374=379
2007/10/21(日) 18:49:20>>373さんが、どのような業務でこのコードをご利用になるのか、わたくしには推測できかねますので、的外れなご提案になっておりましたら
平にお詫び申し上げますが、>>378のコードでは、return result; を行う再に、ベクターの全要素がベクターのコピーコンストラクタによって
コピーされる処理が発生するおそれがあります。もちろん、コンパイラの戻り値最適化によってコピーがおこらないケースもありますが、必ず
そのことが保証されているわけではございません。もし、intのベクターに格納されている要素数が多い場合ですとか、ベクターに格納するのが
intではなく大きな構造体である場合、このことは性能上の大きな問題になることがございます。そこで、vector<int>* foo(); のように、foo()
の中でベクターをnewし、そのポインタを呼び側に戻すようにする設計を採用されますと、要素数が多い場合、一要素のサイズが大きい場合で
も、コピーの時間的コストの問題を回避することが可能でございます。また、現代ですと生のポインタでは無く、スマートポインタというもの
を用いることも可能でございます。その場合の関数シグネチャは、boost::shared_ptr<std::vector<int> > foo(); のようになるはずでござい
ます。残念ながら、ブーストやスマートポインタについてここで詳細にご説明差し上げることは困難ですので、御自分でググレカス
とでも書けと? 毎回こんなん書くほどひまじゃねーよw
#あ、RVOに触れたから>>379より親切になっちゃったw
0390デフォルトの名無しさん
2007/10/21(日) 18:50:270391デフォルトの名無しさん
2007/10/21(日) 18:51:440392386
2007/10/21(日) 18:57:43確かにコピーはコストが高いけど、無条件で避けるのが良いとは思わないな
頻繁に呼ばれない、かつ、返されるvectorがあまり大きくないことが分かっている関数なら、
コードの簡潔さのために値で返すのがよいと思う
モジュールの内部でのみ使う便利関数なら、とりあえず値で返しておいて、
コストが問題になるようなら別の方法に切り替えることもできるし
>>389
丁寧に書けなんて一言も言ってない
俺なら選択肢を提示するにとどめるので、「…できないか、よく考えとけ」という姿勢が
ちょっと気になっただけだ
あと、俺は>>381じゃないので、念のため
0393デフォルトの名無しさん
2007/10/21(日) 19:04:160394デフォルトの名無しさん
2007/10/21(日) 19:06:24・ >>379 は、元質問者が気づいていないかもしれない「コピーのコストの存在」と「避けかた」を示している。これはまさに>>392でいう選択肢の提示だ。
・ 一方、>>386は、選択肢の批判をするだけで、新しい情報の提供や、新しい選択肢は提示していない。これは典型的な煽り。
さて、どっちが有益?
>>392でようやく新しい情報の提示をしたのは評価するが。
0395デフォルトの名無しさん
2007/10/21(日) 19:08:370396デフォルトの名無しさん
2007/10/21(日) 19:13:370397デフォルトの名無しさん
2007/10/21(日) 19:15:000398デフォルトの名無しさん
2007/10/21(日) 19:26:23素直にコピーする vector の実装を vector_impl として、 shared_ptr<vecotr_impl> を
ラップする実装をコピーの軽い vector とすれば可能。
0399デフォルトの名無しさん
2007/10/21(日) 19:28:310401デフォルトの名無しさん
2007/10/21(日) 19:39:32コピーのコストを優先すると何を捨てることになるんだろう。ちょっと考えてみる。トンクス。
0402デフォルトの名無しさん
2007/10/21(日) 19:43:32オブジェクト指向言語と同じだ
GCの代わりをshared_ptrでやろうってこったな
循環参照には無力だが
コピーを安価にするためにはコピーオンライトというテクニックが伝統的に
使われているが、マルチスレッド環境では正直微妙で、下手に使うと
弊害のが多いかもしれん。
0403デフォルトの名無しさん
2007/10/21(日) 19:44:38皆さんいじってくれておおきにww
全然切れてナイッスヨww
STLの参照渡しは最近のお気に入りで乱用しているんだけど
(便利がいいですよね、巨大コンテナも楽々動作してる感じ)
実は、相関関数のクラスライブラリィがどうしても必要になって、
一月程前、STLを覚え始めた頃に作ったコマンドラインで動作する
相関関数のプログラムのコードをいじくりまわしていたら、当事は参照渡しが
使えなかったので、ベクトルをprivateで宣言して、クラス内で可視できるように、
まぁまぁ巧く実装してあったんだけど(自画自賛ww)
ふと、参照渡しができるのなら、参照返しも出来る悪寒がしたので、
あまり期待してなかったんだけど、ここで尋ねてみたってかんじです。
0404デフォルトの名無しさん
2007/10/21(日) 19:46:13std::stringはCoWが多いようだね。
0405デフォルトの名無しさん
2007/10/21(日) 19:50:43コピーのコストが安いことがあるのを忘れるなよ。コードの簡潔さのために
vector<int> foo();
とできないか、よく考えとけ。
感想: 392の「よいと思う」と379の「よく考えとけ」の違いがわからん。俺なら選択肢を提示するにとどめ、「よいと思う」などとは書かない。それと値で戻すコードが簡潔だと考えるのは392の主観で、押し付けがましい。
>>403
よし、次はこれだな。と釣ってみる。
vector<int>& foo()
{
vector<int> result;
return result;
}
0406デフォルトの名無しさん
2007/10/21(日) 19:57:19まえつかってたSTLのstringは、x86むけにしかスレッドの排他制御のコードがはいってなくて、AMD64でそれを使って盛大にあぼーんした。
402のいうマルチスレッドだと微妙、というのは排他制御のコストの話かもしれないけど。
0407デフォルトの名無しさん
2007/10/21(日) 19:58:13イテレータで返す方法とかもありだな
0409デフォルトの名無しさん
2007/10/21(日) 20:04:55ってゆうかイテレータで返す方がつぶしが利きそうだな
0410デフォルトの名無しさん
2007/10/21(日) 20:06:05ローカル変数の参照、ポインタは返しちゃいかんでしょ。
関数抜けたら変数なくなってる。
0411デフォルトの名無しさん
2007/10/21(日) 20:11:56書いてみて。
>>410
釣ら..
0412デフォルトの名無しさん
2007/10/21(日) 20:25:48vector<string>を引数で渡す場合でこんな感じかな
template<typename Iter>
void sub(Iter first, Iter last) {
string foo;
while ( first != last ) {
foo = *first++;
...
}
}
vector<string> vs;
list<string> ls;
string as[5];
sub(vs.begin(), vs.end());
sub(ls.begin(), ls.end());
sub(as, as+5);
0413デフォルトの名無しさん
2007/10/21(日) 20:36:16copy-on-write するなら実体を共有してるうちのどれかに書き込みが発生したときに vector 全体のコピーをしなければならない。
ということで、要素に対する参照や末尾に対する追加が constant time にならず標準の要求を満たさないと思う。
>404
最近は >402 の如く排他制御のコストが高いってんで CoW は避ける方向だと思う。
0414デフォルトの名無しさん
2007/10/21(日) 20:38:26それは「イテレータで返す」とはいわないだろう。。。。。。
「イテレータを渡す」というような。
日本語nativeじゃないとかだったらゴメンだけど。
0415デフォルトの名無しさん
2007/10/21(日) 20:42:46ありがとう。
ということは、最近は std::string foo(); もそれなりにコストかかるんだね。
0416デフォルトの名無しさん
2007/10/21(日) 20:42:53引数は出力イテレータ一個でいいな。で、
vector<int> vec;
foo(back_inserter(vec));
とかやる。
0417デフォルトの名無しさん
2007/10/21(日) 21:04:43ただ、処理の内容にもよるけど iterator で返すことは不可能じゃなくて、
iterator で受けて iterator で返す→いっそ range で受けて range で返せば!→
oven キタ|std::string("タキ")|reversed|cycled(5)|━(゚∀゚)!!!!!
って感じだと思う。
ttp://p-stade.sourceforge.net/oven/doc/html/index.html
0418デフォルトの名無しさん
2007/10/21(日) 21:11:130419デフォルトの名無しさん
2007/10/21(日) 21:13:20彼は特殊だから。。。もちろんいい意味で。
0420デフォルトの名無しさん
2007/10/21(日) 21:41:02その理屈でいくと、 string を copy-on-write で実装するのも不味くないか?
string には計算量の制約が無いんだっけ?
0421デフォルトの名無しさん
2007/10/21(日) 22:33:49なんで.hと分離してんの?
0422デフォルトの名無しさん
2007/10/21(日) 22:58:19今Fedora(Linux)のlibstdc++-4.1.2を見てみたが、refcountされてる。
0423デフォルトの名無しさん
2007/10/21(日) 23:04:36怪しいoven君キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
0424デフォルトの名無しさん
2007/10/21(日) 23:06:04必要性を見出せないのは俺があんまり複雑な事をやってないからかな
0425デフォルトの名無しさん
2007/10/21(日) 23:22:10- VC7以降と最近のSTLPortは単純コピー、スレッドセーフ
- g++3/4(libstdc++)は参照カウント、スレッドセーフティーは怪しい、たぶんアンセーフ
- BCCも参照カウント、スレッドセーフティは不明
みたいだな。More Exceptional C++になんか書いてあるらしいが持ってない。amazon.comに注文かけた。
0426デフォルトの名無しさん
2007/10/21(日) 23:27:54まぁpair<iteratoriterator>がコンテナ風味に使えるのは便利だはな
0427デフォルトの名無しさん
2007/10/21(日) 23:32:03>たぶんアンセーフ
ソース見たら、_Atomic_Word 使ってなんか操作してるな。大丈夫かも。よくわかんね。
0428デフォルトの名無しさん
2007/10/22(月) 00:10:33BOOST_FOREACHなんてどうよ?
あとはrange_ex使えば、アルゴリズム関数の引数で、
c.begin(), c.end()としていたところを
単にcとすればよくなることとか。
0429デフォルトの名無しさん
2007/10/22(月) 00:44:01>>380
http://support.microsoft.com/kb/154419/ja
0430デフォルトの名無しさん
2007/10/22(月) 04:31:36rangeがあれば
auto rng = transformed(sorted(filtered(
equal_range(c, "foo"), identity()), converter<T>());
vector<T> v(rng); // ここで初めて計算
みたいなことが余分な作業領域とコピー無しでできるよ
0431デフォルトの名無しさん
2007/10/22(月) 08:43:180432デフォルトの名無しさん
2007/10/22(月) 08:48:410433デフォルトの名無しさん
2007/10/22(月) 08:57:510434デフォルトの名無しさん
2007/10/22(月) 11:05:560435デフォルトの名無しさん
2007/10/22(月) 12:29:130436デフォルトの名無しさん
2007/10/22(月) 12:31:07rangeに対応したアルゴリズムライブラリでなかったか?
range≒レンガからか…無茶か…
0437デフォルトの名無しさん
2007/10/22(月) 12:38:320438デフォルトの名無しさん
2007/10/22(月) 13:00:110439デフォルトの名無しさん
2007/10/22(月) 13:10:410440デフォルトの名無しさん
2007/10/22(月) 13:26:52これフルに利用したらC++でもLL言語とか使うより手早くソフト作れるんじゃね?
0441デフォルトの名無しさん
2007/10/22(月) 13:37:230442デフォルトの名無しさん
2007/10/23(火) 18:44:23そういう現実をみせつけられると生きている意義が見いだせないよな。
まぁ、俺もゼミで毎週言われていることだが。
0443デフォルトの名無しさん
2007/10/23(火) 19:06:40例えば
int month = [10, 10, 11, 11, 11, 12, 12, 1];
の場合
3,6,8が求めたい
0444デフォルトの名無しさん
2007/10/23(火) 19:08:220445デフォルトの名無しさん
2007/10/23(火) 19:15:36ってことじゃね?
俺なら普通にイテレータで舐めるなぁ。
0446デフォルトの名無しさん
2007/10/23(火) 19:23:070447デフォルトの名無しさん
2007/10/23(火) 19:27:50>>444
>>445
そうです、アルゴリズムのmismatchが使えるかなと思いましたが無理でした
>>446
普通に2,5,7でもいいです
0448デフォルトの名無しさん
2007/10/23(火) 20:20:58# include <algorithm>
# include <iostream>
int main()
{
int v[] = {10, 10, 11, 11, 11, 12, 12, 1};
int *first = v, *last = v + (sizeof v / sizeof v[0]);
while(first != last)
{
first = std::mismatch(first + 1, last, first).first;
if(first != last)
std::cout << first - v << "\n";
}
}
0449デフォルトの名無しさん
2007/10/23(火) 21:13:47mismatchは二つのシーケンスが必要だと思っていたんですが、一つでも出来るんですね。
ところで後だしで申し訳ないですが、要素が年月日の場合同じく、月変りが発生した要素の番号を取得する場合は、どうしたらいいのか教えてもらえませんか
substrで月を切出していくと思うのですがどの様に使ったらいいのかわかんないんで・・・・・
int v[] = {20071001, 20071002, 20071103, 20071120, 20071122, 20071201, 20071208, 20080105};
0450デフォルトの名無しさん
2007/10/23(火) 22:56:57template <class InputIterator1, class InputIterator2, class BinaryPredicate>
pair<InputIterator1, InputIterator2>
mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred);
0451デフォルトの名無しさん
2007/10/24(水) 03:46:070452デフォルトの名無しさん
2007/10/24(水) 03:48:39int に substr() じゃ、どの様に使ったらいいかわからんわな。
v の要素が string のつもりなら substr() して atoi() しとけばいいでしょ。
0453デフォルトの名無しさん
2007/10/24(水) 13:04:25コンパイルは通るけど、例外で死ぬ〜…(VC7)
list<foo *> fooList;// <- 多態性を持たせるためポインタです
/* なんかいろいろ */
for(list<foo *>::iterator fooIt = fooList.begin(); fooIt != fooList.end(); ++fooIt)
{
(*(fooList.begin()))->hoge(); //意味はないけどOK
(*fooIt)->hoge(); //NG...orz (ポインタが取れていないらしい...)
}
0454デフォルトの名無しさん
2007/10/24(水) 13:32:010455デフォルトの名無しさん
2007/10/24(水) 13:47:11おかしいようには見えない。
何か別のところで変なことしてるんじゃないか?
例えばこれなら正しく実行できると思う。
# include <list>
# include <iostream>
using namespace std;
struct foo { virtual void hoge() = 0; ~foo(){} };
struct bar : foo { void hoge() { cout << "bar::hoge\n"; }};
struct baz : foo { void hoge() { cout << "baz::hoge\n"; }};
int main()
{
list<foo *> fooList;
fooList.push_back(new bar);
fooList.push_back(new baz);
fooList.push_back(new bar);
for(list<foo *>::iterator fooIt = fooList.begin(); fooIt != fooList.end(); ++fooIt)
(*fooIt)->hoge();
}
>>454
そのキャストは無意味だろ。
0456453
2007/10/24(水) 14:20:29fooList = getFooList();
な部分があったので、
list<foo *> getFooList();
↓
list<foo *>& getFooList();
で普通に通るようになりましたとさ。
…理由は究明中ってことで。
0457デフォルトの名無しさん
2007/10/24(水) 17:15:040458453
2007/10/24(水) 22:03:44このように省略していたのをちゃんと書けば普通に動きました。
>>456
のような対処は必要ないです。
…違う意味になるってことか?
[誤]
for(list<foo *>::iterator fooIt = (getFooList()).begin(); fooIt != (getFooList()).end(); ++fooIt)
{
(*fooIt)->hoge(); //NG...orz
}
↓↓↓
[正]
list<foo *> fooIt getFooList();
for(list<foo *>::iterator fooIt = fooList.begin(); fooIt != fooList.end(); ++fooIt)
{
(*fooIt)->hoge(); //OK
}
0459デフォルトの名無しさん
2007/10/24(水) 22:18:59fooIt = getFooList().begin()と書くと、getFooListが呼ばれ、その結果が一時オブジェクトにコピーされ、
その一時オブジェクトに対してbeginが呼ばれ、その結果がfooItに格納され、一時オブジェクトが破棄される。
この時点でfooItの指す先は既に破壊されているので、fooItは無効なイテレータ。
さらにfooIt != getFooList().end()とすると、また別の一時オブジェクトが作られて、
そのendとfooItが比較されるわけで、当然まともに動かない。
0460デフォルトの名無しさん
2007/10/24(水) 22:58:32> 14882:2003 23.1.2 / 12
>Table 68 lists sequence operations that are provided for some types of sequential containers but not
> others. An implementation shall provide these operations for all container types shown in the ‘‘container’’
> column, and shall implement them so as to take amortized constant time.
で、Table 68 に operator[] があるけど、string は書かれていないのでこの制約にかからない。
insert() とか Table 67 にあるものは、コンテナ依存なんだけど、vector については 23.2.4 / 1 他に記述がある。
後、iterator の無効化についても規格の記述を満たさなくなると思うけど、こっちは string 自体にも指摘がある。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#263
将来的には string は seqence container ではない、という扱いになるっぽい。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#718
0462デフォルトの名無しさん
2007/10/26(金) 08:00:35「その人達が動き出す未来の時間(int)」を記録してmultimapに格納したいと思っています。それで普通は
#include <map>
typedef std::multimap< int, double, std::less< int > > Mmid;
:
Mmid pairs;
cout << "\nNode Multimap pairs contains:\nKey\tValue\n";
for( Mmid::const_iterator iter = pairs.begin(); iter != pairs.end(); ++iter )
cout << iter->first << '\t' << iter->second << '\n';
とやるところを
typedef std::multimap< int, int, double, std::less< int > > MmidX; //宣言はビルド通ります
MmidX trios; //←ここで定義するとエラーが出ます
とやったら
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_multimap.h: In instantiation of ‘std::multimap<int, int, double, std::less<int> >’:
edge.h:49: instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_multimap.h:118: error: no type named ‘value_type’ in ‘struct std::less<int>’
:
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_multimap.h:170: error: using invalid field ‘std::multimap<_Key, _Tp, _Compare, _Alloc>::_M_t’
make: *** [edge.o] エラー 1
とエラーが出ます。
multimapってやっぱりキーともう一つ対になる値の二つしか保持できないんですか?
もし、そうだとしたら他に何か良い案はありませんか?
0463デフォルトの名無しさん
2007/10/26(金) 09:01:51std::multimap<int, std::pair<int, double>, std::less<int> >
何をしたいのかよくわからんが。
0464デフォルトの名無しさん
2007/10/26(金) 10:10:34ある部屋をキーにすると、Mapでは1つしか格納できないからMultiMap<これが間違い
MultiMapなら引数をたくさん取れる<これも間違い
素直にstructとmapで実装したほうが早いかと。
てか、multimapの仕様書ちゃんと見たら?
STL解説ページでもいいけど。
struct room
{
double a;
int b;
int c;
}
typedef multimap< int, room > d;
0465デフォルトの名無しさん
2007/10/26(金) 20:40:220466デフォルトの名無しさん
2007/10/27(土) 00:15:340467デフォルトの名無しさん
2007/10/27(土) 03:06:51深遠な理由があるのかも知れないが。
0468デフォルトの名無しさん
2007/10/27(土) 03:07:390469デフォルトの名無しさん
2007/10/27(土) 06:18:59下の方の桁の正確さは求められていないっつーことか
じゃ最初から 1/1000 とか 1/10000 とかで int にした方がいいね
0470デフォルトの名無しさん
2007/10/27(土) 16:32:360471デフォルトの名無しさん
2007/10/27(土) 16:52:540472デフォルトの名無しさん
2007/10/27(土) 17:37:152000年問題の騒ぎどころじゃなくなる
0473デフォルトの名無しさん
2007/10/27(土) 17:49:570474デフォルトの名無しさん
2007/10/27(土) 18:17:52long longが使えない環境のために64bit整数を保持しているのかも知れん。
0475デフォルトの名無しさん
2007/10/27(土) 20:31:290476462
2007/10/28(日) 07:26:22>>464さんの方法を読んで一時間くらいでなんとか出来ました。
これは便利ですね。いくらでも送りたい放題じゃないですか。
実はキーは「その人達が動き出す未来の時間(int)」でしたので
構造体の中の要素は二つで済みました。
>>467->>475
そこまで深遠な理由はありませんよ。w
人数がdoubleなのは確率に基づいて計算するからなのです。
ですから、「部屋@から部屋Bへ9.844人が移動」とかあり得ます。
見た目は簡単そうな式なのですが、プログラムにすると大変ですね。
それでSTLのお世話になったのですが、
皆さんのお陰でSTLの問題は解決しましたので
後は送った値をどう処理するかですね。
うまくいくといいんですが…。
これからも度々お世話になると思います。
皆さん、どうもありがとうございました。
0477デフォルトの名無しさん
2007/10/28(日) 07:56:480478デフォルトの名無しさん
2007/10/28(日) 09:00:420479デフォルトの名無しさん
2007/10/28(日) 15:18:50三角関数のテイラー展開くらいまでは高校で習ったが・・・
しかし厳密な収束性とか大学に入るまで
一切気にしてなかったのは秘密だ。
0480デフォルトの名無しさん
2007/10/28(日) 16:53:58旧過程と新過程の試験問題比べれば分かる、センターと一次試験?
0482デフォルトの名無しさん
2007/10/29(月) 03:48:06setのみで済むときでも順番にキー付けておけば配列のように使えますから
setのほうが速いとかすぐれている点はありますか?
0483デフォルトの名無しさん
2007/10/29(月) 03:55:54よくわからん
どういう使い方?
0484482
2007/10/29(月) 04:03:42#include <string>
#include <iostream>
using namespace std;
typedef map<int, string> Set;
main(){
Set x;
x.insert( Set::value_type( 3, "日本" ) );
x.insert( Set::value_type( 1, "日本語化" ) );
x.insert( Set::value_type( 2, "入門" ) );
x.insert( Set::value_type( 0, "ニュース関連" ) );
x[1] = "ニュークリアス";
cout << x[0] << endl;
cout << x[1] << endl;
cout << x[2] << endl;
cout << x[3] << endl;
}
0485482
2007/10/29(月) 04:05:490486デフォルトの名無しさん
2007/10/29(月) 04:28:11#include <set>
#include <string>
#include <iostream>
using namespace std;
main(){
set<string> x;
x.insert("入門" );
x.insert("ニュークリアス" );
x.insert("ニュース関連" );
set<string>::iterator p = x.begin();
while( p != x.end() ){
cout << *p << endl;
p++;}
p=x.find("入門");
cout<<endl<<&p-&x.begin();
}
0487デフォルトの名無しさん
2007/10/29(月) 04:35:39#include <set>
#include <string>
#include <iostream>
using namespace std;
main(){
set<string> x;
x.insert("入門" );
x.insert("ニュークリアス" );
x.insert("ニュース関連" );
set<string>::iterator p,q=x.begin();
p=x.find("入門");
cout << (int)distance( p, q );
}
0488デフォルトの名無しさん
2007/10/29(月) 04:47:53#include <set>
#include <string>
#include <iostream>
using namespace std;
main(){
set<string> x;
x.insert("1" );
x.insert("2" );
x.insert("3" );
cout << (int)distance(x.end(),x.begin());
}
0489デフォルトの名無しさん
2007/10/29(月) 04:49:10cout << (int)distance(x.begin(),x.end());
0490デフォルトの名無しさん
2007/10/29(月) 07:13:11いいえ。
>>487
q が未初期化だから何がおきても不思議じゃない。
>>488
distance() の第1引数は第2引数へ到達可能でなければならないが、
end() は begin() へ到達可能ではないから。
>>489
値がマイナスになっていたわけじゃない。
0491デフォルトの名無しさん
2007/10/29(月) 08:36:56487 の q は初期化されてるだろ。
0492デフォルトの名無しさん
2007/10/29(月) 08:54:42この有様だから間違えるのも仕方ない
0493デフォルトの名無しさん
2007/10/29(月) 08:55:24pとqの位置をひっくり返せばいいんじゃないかな。
#include <set>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
set<string> x;
x.insert("C++" );
x.insert("STL" );
x.insert("BOOST" );
set<string>::iterator p, q = x.begin();
p=x.find("STL");
cout << (int)distance( q, p ) << endl;
return 0;
}
これで動いたよ。俺の環境では2バイト文字使うの面倒だからちょっと変更したけど。
0494デフォルトの名無しさん
2007/10/29(月) 08:58:51> the first iterator would need to be incremented until it was equal to the last iterator.
忘れてならないのは、この"incremented"ってとこですかね。
0495デフォルトの名無しさん
2007/10/29(月) 10:04:110496デフォルトの名無しさん
2007/10/29(月) 10:07:18コンパイラとライブラリ実装による。
ヘッダファイルに定義があるだろうから読んでみればわかるかもしれない。
0497デフォルトの名無しさん
2007/10/29(月) 10:54:15mapの中身を指してるポインタを外部に持ってるんですけど、こういうのって良くないんでしたっけか。
0498デフォルトの名無しさん
2007/10/29(月) 12:36:36SSEを使うかどうかはアルゴリズムの問題じゃなくてコンパイラとコンパイルオプションの問題だろ。
0499デフォルトの名無しさん
2007/10/29(月) 12:46:22その操作でイテレータが変わらないのは仕様にあったと思う。
ポインタにまで言及しているかは知らない。
0500デフォルトの名無しさん
2007/10/29(月) 12:49:300501デフォルトの名無しさん
2007/10/29(月) 13:05:21そういう人は使わなくていいんじゃね?
0502デフォルトの名無しさん
2007/10/29(月) 23:04:40map, set, multimap, multiset のイテレータおよび参照はコンテナから削除されるまで有効。
23.1.2p8
> The insert members shall not affect the validity of iterators and references to the container, and the erase
> members shall invalidate only iterators and references to the erased elements.
0504デフォルトの名無しさん
2007/10/31(水) 18:46:510505デフォルトの名無しさん
2007/10/31(水) 18:55:360506デフォルトの名無しさん
2007/11/01(木) 12:26:380507デフォルトの名無しさん
2007/11/01(木) 12:30:43そのイテレータの対象となるヴェクタのビギンとの差でいいじゃん。
0508デフォルトの名無しさん
2007/11/01(木) 12:46:11std::distance( vector.begin(), iterator );
0510デフォルトの名無しさん
2007/11/01(木) 13:18:49メモリ順序とか関係ない。
0511デフォルトの名無しさん
2007/11/01(木) 13:28:02o ヴィギン
0512デフォルトの名無しさん
2007/11/01(木) 13:33:24beginのどこをどう読んだらヴィギンに?
0513デフォルトの名無しさん
2007/11/01(木) 13:38:430514デフォルトの名無しさん
2007/11/01(木) 13:53:540515デフォルトの名無しさん
2007/11/01(木) 14:10:490516デフォルトの名無しさん
2007/11/01(木) 16:03:250517デフォルトの名無しさん
2007/11/01(木) 17:42:22http://www.geocities.jp/kosako3/oniguruma/index_ja.html
0518517
2007/11/01(木) 17:52:28boostと>>517どっちがいい?
0519デフォルトの名無しさん
2007/11/01(木) 18:17:210520デフォルトの名無しさん
2007/11/01(木) 18:18:23boostスレに行け
0521デフォルトの名無しさん
2007/11/01(木) 18:27:55Flexible Renamerで十分事足りてるんだが。
0522デフォルトの名無しさん
2007/11/01(木) 18:35:470523デフォルトの名無しさん
2007/11/01(木) 21:18:29stringでは読み込めません いい方法ありますか?
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5193.txt
0524523
2007/11/01(木) 21:21:26#include <iostream>
#include <string>
#include <fstream>
using namespace std;
main(){
string a,b;
fstream fp("dd",ios::in);
for(;;){
getline(fp, b);if(fp.eof())break;
a=b.substr(0,2);
b=b.substr(4,2);
if(a!=b)cout<<a<<"\t"<<b<<"\n";
}}
0525デフォルトの名無しさん
2007/11/01(木) 21:26:56http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5194.zip
こうしたいって事?
0526523
2007/11/01(木) 21:29:19どうやったらいいですか?
0527523
2007/11/01(木) 21:35:050528デフォルトの名無しさん
2007/11/01(木) 21:39:39どうやって?
0529デフォルトの名無しさん
2007/11/01(木) 22:02:41ていうかスレ違いじゃね
0530デフォルトの名無しさん
2007/11/01(木) 22:23:100531デフォルトの名無しさん
2007/11/01(木) 22:32:160532デフォルトの名無しさん
2007/11/01(木) 22:36:38サンクス
0533462
2007/11/03(土) 09:10:13<multimap>のerase()の括弧の中に何を入れれば、一番最初かもしくは一番最後の要素が消せるのでしょうか?
数字を入れるとキーが消せるのは分かるのですが、IteratorのPositionで消す方法が分かりません。
エスパー能力が必要かもしれませんが、どうかプログラムの断片を診てやってください:
■ edge.h ■
#include <map>
typedef std::multimap< int, double, std::less< int > > Mmid;
struct TIMESTRUCT
{
int arrivalTime;// arrival time = day time
double avatar; // number of avatars in a bank
};
TIMESTRUCT timeCapsule;
Mmtc atTime; // declare the multimap atTime;
■ node.cpp ■
if (edge->sourceNode() == this) {
edge->timeCapsule.arrivalTime = dTime;
edge->timeCapsule.avatar = edge->_bank2;
edge->atTime.insert( Mmtc::value_type( dTime + edge->r(), edge->timeCapsule ) ); //挿入しています
}
Mmtc::const_reverse_iterator r_iter;
for( r_iter = edge->atTime.rbegin(); r_iter != edge->atTime.rend(); ++r_iter ) {
edge->xWander = dayTime - ( (r_iter->second.arrivalTime - 1) + edge->r() );
cout << r_iter->first << '\t' << r_iter->second.arrivalTime << "\t\t"
<< r_iter->second.avatar << "\t\t" << edge->xWander << "\n";
}
edge->atTime.erase(5); // 問題はこの括弧の中です;これだとキーが'5'の要素だけが消せます
edge->atTime.erase(r_iter.rend()); // コンパイルできません;mo matching
よろしくお願いします。
0534デフォルトの名無しさん
2007/11/03(土) 09:20:41const_reverse_iteratorにrend()なんてメソッドがあるかよく調べるんだ
0535デフォルトの名無しさん
2007/11/03(土) 09:26:340536デフォルトの名無しさん
2007/11/03(土) 09:27:050537462
2007/11/03(土) 09:29:48ttp://www14.atwiki.jp/yonecle/pages/13.html
rend()
reverse_iterator rend();
const_reverse_iterator rend() const;
…コンテナの先頭を指す逆方向反復子を返す。
本当にこれだけじゃなくていろいろやってみたんですよ。
もうアイディアが尽きました。
●erase()
void erase( iterator i); ←これと
…iが指す要素を削除する。
void erase( iterator start ,iteraterend); ←これの意味が分かりません
…startからendまでの範囲の要素を削除する。
size_type erase( const key_type& k);
…コンテナからキーの値がkである要素を削除する。
・・・取り敢えず、r_iterは使いますよね?
0538462
2007/11/03(土) 09:33:42はっ!
そうでした!
でも'rbegin()'でもダメだったような気が・・・
それにしてもこれに関する例って
ただのひっっっっっとつもないんですよ・・・。
これだけ探してないとなるとびっくりしますよ。
あったら御一報願います。
0539デフォルトの名無しさん
2007/11/03(土) 09:35:35edge->atTime.rend()
0540462
2007/11/03(土) 09:41:17はい、自分もここ
for( r_iter = edge->atTime.rbegin(); r_iter != edge->atTime.rend(); ++r_iter ) {
で使っています。
あっ!
もしかしてr_iterだけで良かったのかも!
edge->atTime.erase(r_iter); // ←現在指している要素
正解ですか?
それなら
r_iter = edge->atTime.rbegin();
ってやっておいて
edge->atTime.erase(r_iter);
なら最初の要素が
r_iter = edge->atTime.rend();
ってやっておいて
edge->atTime.erase(r_iter);
なら最後の要素が消せますよね?
0541462
2007/11/03(土) 09:42:45r_iter = edge->atTime.rend();
ってやっておいて
edge->atTime.erase(--r_iter); // ←落とし穴
なら最後の要素、ですね?
0542デフォルトの名無しさん
2007/11/03(土) 09:49:47rbegin() 最後の要素
0543462
2007/11/03(土) 09:53:52はっ!
そうだったんですか!
C++の本の付録のページで勉強してますからね・・・。
また一つ賢くなりました。
皆さん、またまたご協力ありがとうございました!
0544デフォルトの名無しさん
2007/11/03(土) 10:01:24ネット使えてるんならいくらでもSTL解説サイト見れるだろう
0545デフォルトの名無しさん
2007/11/03(土) 10:09:270546462
2007/11/03(土) 10:14:50はい、もういろいろ読みました。
http://www.sgi.com/tech/stl/ ←こことか
でも、何故か「辞書」みたいなのしか見つからないんですよね:
●erase()
void erase( iterator i);
void erase( iterator start ,iteraterend);
size_type erase( const key_type& k);
・・・何故にそんなにボトムアップなんだろうって思います。
英語の辞書を読んで英会話をマスターしているような気分です。
時々、STLってC++本体とは別物に思えます。
あ、もうこんな時間じゃないですか!
・・・では、寝ますです(^_^)/~
>>545
え、その.base()というのは何ですkZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
0547デフォルトの名無しさん
2007/11/03(土) 11:58:14>時々、STLってC++本体とは別物に思えます。
ライブラリなんだから、そのライブラリの「お約束」を知る必要があるのは当然。
>でも、何故か「辞書」みたいなのしか見つからないんですよね:
いくつかの基本的な概念さえ押さえておけば、後は「辞書」みたいものだけで事足りるから。
つまり(自覚してると思うけど)今足りないのは基本的な概念の把握。
これも割と辞書的ではあるけど
ttp://www005.upp.so-net.ne.jp/episteme/html/stlprog/
あたりを読んでみれば?
で、もうちょい概念を押さえたら EffectiveSTL を読んどくのがおすすめ。
例えば今回の件は、第 26 項、第 28 項を読めば解決するはずだ。
簡単に言えば、コンテナのメンバ関数には reverse_iteartor を渡せないので
base() を使って iterator に変換してやる必要がある。
ただしその際、(削除を行う場合には)位置の調整をしてやる必要があるため、
container.erase((++r_iter).base());
みたいにする必要がある。
なお、ループしてる際の erase には iterator の無効化という別の問題があるため
それにも注意が必要(EffectiveSTL 第 9 項参照)。
0548デフォルトの名無しさん
2007/11/03(土) 13:02:00vectorやlistの要素へのポインタを持つ場合( p = vec[6]; とか p = &itLit )
このpがずっと安全にその要素をさしつづける保証はあるのでしょうか?
・当然元の vector や list が開放されればさせなくなるのはわかります
・たしか、vectorはpush_backしていくとメモリーの再確保が発生するので、要素の存在位置がかわるはず
・listは双方向リストだから大丈夫?
・mapのsecondとかは? firstはソートされるため変化しそう
0549デフォルトの名無しさん
2007/11/03(土) 13:23:21listとmap類は大丈夫。mapのfirstも。
ついでに言うと、mapはpair<key, value>を保持している訳だから、
firstが動いてsecondが動かないということはありえない。
ソートはポインタの付け替えでできる。
0550デフォルトの名無しさん
2007/11/03(土) 13:30:00>vectorやlistの要素へのポインタを持つ場合( p = vec[6]; とか p = &itLit )
どっちも要素へのポインタと思えないのが少し不安。
0551デフォルトの名無しさん
2007/11/03(土) 14:47:08firstも大丈夫なんですか!?
どうやって二分探索してるんでしょうmapは・・・
ソートはポインタの付け替えでできる・・・?うーん、STLの本買うと面白そうですね
>>550
p=&vec[6]ですね。
p=itList
ですね。お恥ずかしい
0552デフォルトの名無しさん
2007/11/03(土) 15:07:18struct node {
pair<const key_type, mapped_type> value;
node* left;
node* right;
};
みたいな感じのノードを持ってて、挿入や削除があるたびに、
与えられた比較関数なりファンクタなりの結果をもとにleft, rightのアドレスを付け替えてるんだ。
valueはキーと値のセットなわけだから、secondが大丈夫なのにfirstがダメってことは無い。
0553デフォルトの名無しさん
2007/11/03(土) 21:31:34ちがかったのか・・・
0554デフォルトの名無しさん
2007/11/03(土) 22:58:23vector<T>::value_typeはT、list<T>::value_typeもTだけど、
map<Key, T>は、Keyがkey_typeでTがmapped_type、肝心のvalue_typeはpair<const Key, T>だから。
つまり、pair<const Key, T>型こそが「mapの値」の地位にあるわけ。
0555デフォルトの名無しさん
2007/11/04(日) 01:13:11vectorはあからさまにだめそうだけど、setやlistあたりはNullObjectとして空の要素を確保してたりするのかな。
↓こんな感じのことって有り?
map<Key, Value> map_;
map.end().second = Value(...); // キーが見つからないときのデフォルト値
0556デフォルトの名無しさん
2007/11/04(日) 01:13:580557デフォルトの名無しさん
2007/11/04(日) 02:09:33こんな深夜にありがとう。
0558デフォルトの名無しさん
2007/11/04(日) 05:57:440559デフォルトの名無しさん
2007/11/04(日) 10:08:050560デフォルトの名無しさん
2007/11/04(日) 12:42:30さっき『Effective C++第3版』と『Effective STL STLを使いこなす50の鉄則』を
書店で立ち読みしていて、どっちを買うか迷ったが結局両方買ってしまった
しかしコンピュータ関連に限らないけど専門書って高いよね。
そこで問題です。
v1とv2という2つのvectorがあるとする。v1をv2の後ろ半分と同じ内容にする最も簡単な方法は何だろうか。
v2の要素数が奇数であるときに「半分」をどう定義するかは気にせずに、妥当な方法を考えてほしい。
0561デフォルトの名無しさん
2007/11/04(日) 12:54:24std::vector<T>::size_type sz = v2.size()/2
v1.resize( v2.size() - sz );
std::copy_backward( v2.begin() + sz, v2.end(), v1.end() );
0562デフォルトの名無しさん
2007/11/04(日) 12:58:540563デフォルトの名無しさん
2007/11/04(日) 13:05:53ふふふ さっそく(Effective STLを)つかっているな
0564デフォルトの名無しさん
2007/11/04(日) 13:08:40>>562
最優秀賞を差し上げます。
560も『Effective STL STLを使いこなす50の鉄則』読んだのか、
因みに
>>561の解答は明示的にループは使ってないから、一見効率よさそうに見えるが
std::copy_backwardの中でループ処理を行うのでassignより効率は悪い。
0565デフォルトの名無しさん
2007/11/04(日) 13:13:28>>560です
いい本ですねこの本、STL本で最初に買ったのが、ハーバート・シルトの
STL標準講座だったんだけど、基礎的な用法しか書いてなかった、
実用的なのはEffective STLのだね。
0566561
2007/11/04(日) 13:14:190567デフォルトの名無しさん
2007/11/04(日) 13:21:40561 の効率が悪いのはループ云々じゃない。内部でループするかしないかって話なら
assign() でもしてるはず。
本質的な違いは、「デフォルト初期化+初期値代入」と「初期値で初期化」の違い。
0568デフォルトの名無しさん
2007/11/04(日) 13:30:09∈( ̄o ̄)∋ ホーッなるほど
0569462
2007/11/06(火) 17:54:06この短期間に二回も引越していてレスが出来ませんでした。あれから
r_iter = edge->atTime.rbegin(); // line 103
edge->atTime.erase((++r_iter).base()); // line 104
とやってみたのですが、以下のようなエラーが出ます:
node.cpp: In member function ‘void Node::backAndForth(int)’:
node.cpp:104: error: no matching function for call to ‘std::multimap<int, TIMESTRUCT, std::less<int>,
std::allocator<std::pair<const int, TIMESTRUCT> > >::
erase(std::_Rb_tree_const_iterator<std::pair<const int, TIMESTRUCT> >)’
以下略
make: *** [node.o] エラー 1
edge->atTime.erase(r_iter);でもほぼ同じエラーが出ます。
構造体を使ってしまったから普通の方法ではダメなのでしょうか?
0570デフォルトの名無しさん
2007/11/06(火) 18:27:07エラーメッセージをよく見て。
atTime が const っぽい。
0571462
2007/11/07(水) 07:33:48本からのコピペだったので無意識のうちにconst_reverse_iteratorを使っていました。
普段からconst付ける癖がないのでこういう目に遭うんですね、きっと。
今日は>>535-536さんの忠告が今頃になって役に立ちました。
結果が0にならないといけないところが1.2345678e-318みたいになっていて
KDevelopでデバッグしたところ、rend()の値をコピーしていたのが原因と分かりました。
忠告がなかったら今でもデバッグ中だったと思います。
更に精進致します。
もっと時間があれば本を読むんですけどね…
あ、前回、C++本の付録で勉強していると書きましたが、実際は24章あるうちの1章でした。
ま、STL本じゃないのは確かです。
0572デフォルトの名無しさん
2007/11/07(水) 21:09:480573デフォルトの名無しさん
2007/11/13(火) 17:25:58逆順は reverse() で、できたのですが;
0574デフォルトの名無しさん
2007/11/13(火) 17:28:53random_shuffle()
0575デフォルトの名無しさん
2007/11/14(水) 02:23:36ありがとうございます。STL ってすごいですね。
自前で作るより、極力あったら使おうと思って、聞いてしまいました。
0576デフォルトの名無しさん
2007/11/14(水) 22:23:23具体的には、random_shuffle前と全く同じ並びになることがない。
麻雀だのトランプだの選曲順だのならそれで問題ないとおもうが、
並び替える個数が少ない場合は問題になると思う。
0577デフォルトの名無しさん
2007/11/14(水) 23:11:45まったく同じならびにならないという根拠をkwsk
少なくとも自分の環境のrandom_shuffleのコードでは、
そんなわけのわからん現象は発生しないかった。
0578デフォルトの名無しさん
2007/11/15(木) 01:27:16それよりも、第三引数を省略すると、結果が毎回一緒で使い物にならん。
0579デフォルトの名無しさん
2007/11/15(木) 01:43:180580デフォルトの名無しさん
2007/11/15(木) 21:44:35ttp://ray.sakura.ne.jp/tips/shaffle.html
の1番下
0581デフォルトの名無しさん
2007/11/17(土) 10:51:31> Complexity: Exactly (last - first ) - 1 swaps.
要素数が2の場合、必ず交換されることにならないか?
0582デフォルトの名無しさん
2007/11/17(土) 11:28:060583デフォルトの名無しさん
2007/11/17(土) 11:34:21>580 の URL にある「改善策」の swap 回数はそうなってる。
0584デフォルトの名無しさん
2007/11/17(土) 12:51:09オーダー的には特化で線形探査でもしてくれたらいいんだけど、
微妙に意味が違うからやってくれなさそう。
そもそもlistで整列データ管理すんのがお門違いなんだけどw
0585デフォルトの名無しさん
2007/11/17(土) 15:28:46じゃあ安心して使えるな
0586デフォルトの名無しさん
2007/11/17(土) 16:02:53イテレータのインクリメント・デクリメントが比較関数に対して無視できるほど軽いとすれば
O(log n) といえるんじゃないだろうか?
0587デフォルトの名無しさん
2007/11/17(土) 16:04:57その通り
0588デフォルトの名無しさん
2007/11/17(土) 17:40:080589デフォルトの名無しさん
2007/11/17(土) 17:57:24・Model
・Concept
・Refinement
ってSGIのリファレンスに載ってるんでしょうか?
なんかSTLを使うのに関してかなり重要な概念らしいんですが、全然意識してなかったので気になります
0590デフォルトの名無しさん
2007/11/17(土) 18:53:45http://www.boost.org/more/generic_programming.html#concept
(http://www.issei.org/programming/boost/more/generic_programming.htm)
0591デフォルトの名無しさん
2007/11/18(日) 00:59:03それが std::map。
0592デフォルトの名無しさん
2007/11/18(日) 09:47:540593デフォルトの名無しさん
2007/11/19(月) 22:49:34でもサイズとか増やせちゃうわけじゃないですか。
でメモリのアドレスが連続になるような確保って一括で確保しなきゃらならないですよね?
と言うことはcapacityが変わる時って変化後の容量分一括確保してそこに変化前の値をコピーして元データを削除
とかやってるんでしょうか?
なんかVCに付属のソース見ても何やってるのかいまいちわからないと言うか、
アンダースコアとかマクロだらけで読む気がなくなるというかで疑問のままなんです
0594デフォルトの名無しさん
2007/11/19(月) 22:51:07その理解で合ってる
0595デフォルトの名無しさん
2007/11/20(火) 16:04:26typedef pair<int,int> AA;
vector<AA> v;
にて、v要素の firstに対して検索したいのですが
どのようにすれば良いでしょうか?
find_if()を試してみたのですが、私の力ではpairの組みで一致
するところまでしか出来ませんでした。
p = find_if(v.begin(), v.end()
, bind1st( equal_to<AA>(), AA(10,15) ) // 本当はsecond無視で first==10を見つけたい
);
0596デフォルトの名無しさん
2007/11/20(火) 18:56:38intふたつ持った構造体に比較関数定義した方がよくないか?
0597デフォルトの名無しさん
2007/11/20(火) 19:12:230598デフォルトの名無しさん
2007/11/20(火) 19:14:18typedef std::pair<int,int> AA;
std::vector<AA> v;
struct Comp {
int m_i;
Func(int i) : m_i(i) {}
bool operator()(AA const& i) const {
return i.second == m_i;
}
};
v.push_back(std::make_pair(10,15));
std::vector<AA>::iterator p = std::find_if(v.begin(), v.end(), Comp(15));
}
STLの範囲で、boost::lambda使わなきゃこんな感じ??
使えば次のようになる
find_if(v.begin(), v.end(), bind(&AA::second, _1) == 15 );
0599595
2007/11/20(火) 19:49:48>>596-597
リスト位置と内容、この3つの値を使うリストということで
ご了解いただければ。
>>598
なるほど。比較構造体を作るわけですか。
参考にさせていただきます。有難う御座いました。
0600デフォルトの名無しさん
2007/11/21(水) 06:25:160601デフォルトの名無しさん
2007/11/21(水) 13:50:490602デフォルトの名無しさん
2007/11/21(水) 14:18:57比較構造体ではなく関数オブジェクト、もしくはFunctorと言え。
0603デフォルトの名無しさん
2007/11/22(木) 08:41:140604デフォルトの名無しさん
2007/11/22(木) 22:06:08さぁ、算符を書く仕事にもどるんだ
0605デフォルトの名無しさん
2007/11/23(金) 17:03:12課長が呼んでたぞ
0606デフォルトの名無しさん
2007/11/24(土) 03:31:06→直訳=比較構造体
0607デフォルトの名無しさん
2007/11/24(土) 04:45:080608デフォルトの名無しさん
2007/11/24(土) 15:18:070609デフォルトの名無しさん
2007/11/24(土) 15:41:310610デフォルトの名無しさん
2007/11/24(土) 17:56:580611デフォルトの名無しさん
2007/11/24(土) 19:26:59→string
0612デフォルトの名無しさん
2007/11/24(土) 20:50:15→strip
0613デフォルトの名無しさん
2007/11/24(土) 21:30:07を思い出したが、たぶん知ってる奴はあまり居ない
0614デフォルトの名無しさん
2007/11/24(土) 21:48:340615デフォルトの名無しさん
2007/11/24(土) 22:00:330616デフォルトの名無しさん
2007/11/25(日) 11:33:290617デフォルトの名無しさん
2007/11/25(日) 15:33:55おやおやおや〜?
0618デフォルトの名無しさん
2007/11/25(日) 17:30:24class Foo {
vector<string> vec; //これはOK
vector<string> vec(5); // error C2059: 構文エラー : '定数'
public:
Foo();
~Foo();
};
クラスのメンバ変数に固定長のコンテナを作るとエラーになるのはなんで?
0619デフォルトの名無しさん
2007/11/25(日) 17:36:540620デフォルトの名無しさん
2007/11/25(日) 17:37:49初期化はそんなところに書けない
コンストラクタに書く
Foo::Foo() : vec(5)
{
}
0621デフォルトの名無しさん
2007/11/25(日) 17:59:29もう一つだけお願い
typedefした場合の初期化はこれでOK?
class Foo {
typedef vector<string> vec;
public:
Foo();
~Foo();
};
Foo::Foo()
{
vec(5);
}
0622デフォルトの名無しさん
2007/11/25(日) 18:04:56何をしたいのかワカンネ
0623デフォルトの名無しさん
2007/11/25(日) 18:18:580624デフォルトの名無しさん
2007/11/25(日) 19:11:050625デフォルトの名無しさん
2007/11/25(日) 20:09:410626デフォルトの名無しさん
2007/11/25(日) 21:16:43アルゴリズムを使って可能でしょうか?可能な場合どうすれば良いでしょうか?
0627デフォルトの名無しさん
2007/11/25(日) 21:21:41できそう。ソート順が望むものになるかどうかわかんないけど。
っていうか、自分で試してから相談しろよ。できそうにないと思うならその理由付きでな。
0628デフォルトの名無しさん
2007/11/25(日) 22:12:04通常のASCIIと同じやり方で問題なし
0629デフォルトの名無しさん
2007/11/26(月) 00:40:53その場合のFoo::vecは型だ。
インスタンスに初期化を施すという常識をぶち破って型に対して初期化なんてもう訳が分からない。
それで何をしようとしている?vec(5)は単に、使えないvector<string>のインスタンスを作っているに過ぎない。
もし有用な閃きでもしたんなら、びょーんすっぽすっぽに直に談判してこい。
0630デフォルトの名無しさん
2007/11/26(月) 01:51:51(#‘д‘) < だ、だれがハゲやねん!
∪ l| ||
@ノハ@ =3 ペシッ!!
0631デフォルトの名無しさん
2007/11/27(火) 21:42:51operator = をうまく定義できませんよね?
(コピーコンストラクタは定義できますが)
ということはコンテナには入れることができないということでしょうか?
0632デフォルトの名無しさん
2007/11/27(火) 22:17:100633デフォルトの名無しさん
2007/11/27(火) 22:54:420634デフォルトの名無しさん
2007/11/27(火) 23:50:52定義すればいいだろ
0635デフォルトの名無しさん
2007/11/28(水) 00:36:200636デフォルトの名無しさん
2007/11/28(水) 01:24:12wstringにはコピーコンストラクタは実装されて
いるのでしょうか?
関数にパラメータでwstringのインスタンスを
渡したら、実行時エラーになってしまいます。
0637デフォルトの名無しさん
2007/11/28(水) 01:28:52wstring はコピーコンストラクタでコピーを生成できる。
問題が再現する最小のソース作ってみて。
できたら、使ってるコンパイラも添えて貼ってみてほしい。
0638デフォルトの名無しさん
2007/11/28(水) 07:19:49コンパイラ :Visual Studio 2005 Express Edition
#include <iostream>
#include <string>
using namespace std;
wstring display(wstring path){
wstring work = path;
int i;
//パスの最後の\の位置を調べる
i = work.find_last_of(L'\\');
//それより後の部分を取り出す。
work = work.substr(i + 1, work.size());
return work;
}
int main(){
wchar_t *org = L"origi\\nal";
wstring *worg = new wstring [1];
worg[0] = org;
wcout << display(worg[0]) << endl;
return 0;
}
よろしくお願いします(^人^)
0639デフォルトの名無しさん
2007/11/28(水) 08:04:46VS2005EE で試してみたけど、 "nal" って表示されて終わった。エラーは出ない。
エラーメッセージは?
0640デフォルトの名無しさん
2007/11/28(水) 08:10:10work.size() にしてるのは問題ないんだっけ?
というか最後まで取り出すなら work.substr(i+1) でいいよね。
0641デフォルトの名無しさん
2007/11/28(水) 08:11:19じゃなくて
wstring display(wstring path)
なんだよね
っつーことは
wstring work = path;
より前に既に関数呼び出しの時点で
引数渡しのためにコピーコンストラクタが(ry
0642デフォルトの名無しさん
2007/11/28(水) 08:18:51i = work.find_last_of(L"\\");
0643デフォルトの名無しさん
2007/11/28(水) 08:32:20wchar_t *org = L"origi\\n表al";
で試したら
n
しか出力されませんでした
本当にありがとうございました
0644デフォルトの名無しさん
2007/11/28(水) 08:53:26くらいしろと
0645デフォルトの名無しさん
2007/11/28(水) 09:23:59locale に渡せる言語の一覧ってどこ?
0646デフォルトの名無しさん
2007/11/28(水) 09:41:19http://msdn2.microsoft.com/ja-jp/library/39cwe7zf(VS.80).aspx
Linuxならlocaleコマンド
0647デフォルトの名無しさん
2007/11/28(水) 12:42:48ふぅむ、それは処理系というかライブラリ依存なのか。
もっと、なんつーか、ISO とか IANA で決まってるのかと思ってた。
0648デフォルトの名無しさん
2007/11/28(水) 17:35:52主要なライブラリベンダ同士でC/C++標準とは別に取り決めでもしてくれればいいのにと思う。
ちなみに""と"C"だけはどの処理系でも使えると決まっている。
0649デフォルトの名無しさん
2007/11/28(水) 18:59:290650デフォルトの名無しさん
2007/11/28(水) 19:05:52普通のWindowsアプリケーションに適用できないのが痛い。
0651デフォルトの名無しさん
2007/11/28(水) 19:07:130652デフォルトの名無しさん
2007/11/28(水) 20:15:57ろくすっぽ実装されてなかったような……
0653デフォルトの名無しさん
2007/11/28(水) 21:54:010654デフォルトの名無しさん
2007/11/29(木) 19:17:53なぜか Visual Studio では IntelliSense がしぬ.
0655654
2007/11/29(木) 19:55:22std::list<T>::reverse_iterator
std::list<T>::const_reverse_iterator
これを使うと以降 IntelliSense がしぬ.
0656デフォルトの名無しさん
2007/11/29(木) 20:07:510657デフォルトの名無しさん
2007/11/29(木) 23:53:480658デフォルトの名無しさん
2007/11/29(木) 23:57:502008でもそうなん?
0659デフォルトの名無しさん
2007/11/30(金) 00:13:20による解釈を激しく拒むタイプの文法構造になってるというのは有名な話だな
0660デフォルトの名無しさん
2007/11/30(金) 01:38:520663デフォルトの名無しさん
2007/12/01(土) 11:10:41typedef struct data {
string yymmdd;
int code;
double openprice;
} data;
vector<stockdata> workcontainer;
...データを入れたとして...
この様な構造体の要素を持つベクトルのopenpriceの最大値を求めるのに
double max = max_element( workcontainer.begin()->openprice,
workcontainer.end()->openprice );
としたら
error C2100: 間接指定演算子 (*) の使い方が正しくありません。
となるんですが、何処が間違ってますか?
0664デフォルトの名無しさん
2007/12/01(土) 11:22:44呼出しが間違い。
max_elementにはiteratorを渡すこと。
0665デフォルトの名無しさん
2007/12/01(土) 11:32:05このスレでは割とよくでる質問らしいけど、
比較用の関数オブジェクトを用意してやるとうまくいくみたい
STLの関数等にどんな型のオブジェクトを渡してやればいいかは
ttp://www.sgi.com/tech/stl/を参考にすれば概ね問題無いようだ
#include <algorithm>
#include <string>
#include <vector>
#include <cassert>
struct data {
data(double d) : openprice(d) {}
std::string yymmdd;
int code;
double openprice;
};
bool compare(data const& lhs, data const& rhs) {
return lhs.openprice < rhs.openprice;
}
int main() {
std::vector<data> v;
v.push_back( data(0.01) );
v.push_back( data(0.1) );
v.push_back( data(0.2) );
double max = std::max_element(v.begin(), v.end(), &::compare)->openprice;
assert( max == 0.2 );
}
0666デフォルトの名無しさん
2007/12/01(土) 12:20:32>>このスレでは割とよくでる質問らしいけど、
そうなんですか、漏れも一般的な2ちゃんねらーということですねww
ところで、一点質問お願いします
初期化子で
data(double d) : openprice(d) {}
このように書かいてもらいましたが
自分は最初下記のように書いてたのですが、これでもOK?
openpriceはdouble型即ち、組込み型なのでいいと思うのですが、いかがなものでしょうか?
struct data {
std::string yymmdd;
int code;
double openprice;
stockdata() : yymmdd(""), code( 0 ), openprice( 0.0 ){}
};
0667デフォルトの名無しさん
2007/12/01(土) 12:38:56どんなコンストラクタを用意するべきかは「どんな初期化をしたいか」によるから、
「組み込み型はデフォルトで0って初期化もありでしょう」ぐらいしか言えない
0668デフォルトの名無しさん
2007/12/01(土) 12:45:31>>上の例では生成と同時にdata::openpriceに値を設定したかったから
ってことは、
data() : yymmdd(""), code( 0 ), openprice( 0.0 ){}
これでは、生成と初期化が同時に出来ないということなんですね(自分では出来てるつもりだった^^;)
メイヤー先生の本をもう一回読み直して出直します。
ありがd
0669デフォルトの名無しさん
2007/12/01(土) 15:11:59そもそも map/multimap に対してソートって意味ないような気もしますが,
map/multimap 同士に std::includes を適用したいことはあると思うのです.
しかし std::includes はソート済みのコンテナ同士に対してしか
適用できません.
std::multimap<int,int> multimap1;
multimap1.insert(std::pair<int,int>(1,2));
multimap1.insert(std::pair<int,int>(1,3));
multimap1.insert(std::pair<int,int>(2,5));
std::multimap<int,int> multimap2;
multimap2.insert(std::pair<int,int>(2,5));
multimap2.insert(std::pair<int,int>(1,2));
multimap2.insert(std::pair<int,int>(1,3));
のような二つの multimap に対して std::includes を適用した結果は
true になりますが,たとえば
std::multimap<int,int> multimap2;
multimap2.insert(std::pair<int,int>(2,5));
multimap2.insert(std::pair<int,int>(1,3));←ここがちがう
multimap2.insert(std::pair<int,int>(1,2));←ここがちがう
とすると false になります.Visual C++ 2008 でデバッグバージョンで
ビルドすると STL の内部のアサーションで「ソートされてない」
として実行が中断されます.かといって
std::sort(multimap2.begin(), multimap2.end());
はコンパイルできません.
multimap 同士で STL の集合演算を行うことはできないのでしょうか?
0670デフォルトの名無しさん
2007/12/01(土) 16:27:31同じキーに対する要素間でのソート基準が規定されてないから。
multimap 以外は使えるんじゃない?
0671デフォルトの名無しさん
2007/12/01(土) 17:14:46multimapではなくstd::set<std::pair<int, int> >にでもするほうがいいと思う。
0672デフォルトの名無しさん
2007/12/02(日) 07:01:20STLのvectorやmapが凄く効率悪いような気がしてならないんですが、
そのへん、どう考えたらいいんでしょう?
一応自分なりに考えて見たんですが↓、正解有ります?
(1) C++は全般的にJavaやC#より速いので、気にするのは無益。
(2) 熟練プログラマはオブジェクトへのポインタを格納するのが普通なので速い。
(3) 熟練プログラマはshared_ptrを使うのが普通なのでC#と同等。
0673デフォルトの名無しさん
2007/12/02(日) 08:28:25vector<T>じゃなくてvector<T*>を選ぶことはある。
でも、Tがポインタと同サイズだったら、コピーのコストは変わらず、読む速度はむしろ速いわけで、
STLはこっち、つまり「最速を叩き出す道を仕様によって閉ざさない」ことのほうを重視してる。
あと、mapはコピー渡しのコストとはあまり関係無いはず。
大抵、mapが持っているのは
struct node {
pair<key_type, mapped_type> value;
node* prev;
node* next;
};
みたいなノードで、挿入や削除のたびにポインタを付け替えてるだけだから。
0674デフォルトの名無しさん
2007/12/02(日) 11:30:04---------------------------
wstring.exe - アプリケーション エラー
---------------------------
"0x7c950de3" の命令が "0xffffffff" のメモリを参照しました。メモリが "read" になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
---------------------------
OK
---------------------------
実行するとこのようなダイアログが出ます。。
0675デフォルトの名無しさん
2007/12/02(日) 11:50:29C# で値・参照型 ( struct/class ) を検討する場合を考えたら良いと思う。
データがポインタサイズ以下である事が多いなら、>>673 の書いているとおり、
コピーの方が速く、逆ならば参照型 ( Copy On Write )で設計した方が良い。
(2)、(3) の方法だと、データを使用する側でコストを意識する必要があるが、
データ型が予め適切な型 ( 値・参照 ) として設計されていれば、使用側は単純
なコピーだけ考えれば良いし、後に値・参照を切り替えたくなった時でも、
データ型の内部実装を変更するだけなので、メンテナンスコストも低くなる。
0676デフォルトの名無しさん
2007/12/02(日) 12:16:26>>638のコードコンパイルに成功して、実行できたぞ?
"0x7c950de3" の命令が "0xffffffff" のメモリを参照しました。メモリが "read" になることはできませんでした。
はいわゆる、メモリ保護違反のことだ
これ豆知識な
0677デフォルトの名無しさん
2007/12/02(日) 12:27:14参考になります。
ちなみに、C#で値型・参照型の使い分けは、経験的に16byteぐらいが目安とか
MSの中の人がMSDNかどこかで書いてました。
C++でもポインタサイズ(+α)の目安が有りそうですね。
0678デフォルトの名無しさん
2007/12/02(日) 12:30:32一応boostにptr_vectorってのがあるぞ。
std::vectorをそのまま置き換えるだけじゃうまくいかない部分もあるらしいけど。
0679デフォルトの名無しさん
2007/12/02(日) 13:01:59IDEからコンパイルしてますか?
コマンドラインからコンパイルしてますか?
私はIDEからコンパイルしているんで、同じようにIDEから
コンパイルしているなら、私のIDEの設定がどこかおかしいようですね・・
IDEの設定なんか項目数が多すぎてどうやって比較したらいいんだろ・・
0680デフォルトの名無しさん
2007/12/02(日) 13:18:51うん
>>IDEの設定なんか項目数が多すぎてどうやって比較したらいいんだろ・・
文字セット、プリコンパイルの設定くらいかな、自宅のPCの場合
仕事だとライブラリィ関係のパスやMFCだとDLLリンクかスタティックリンクあたりも
気にするが?
0681デフォルトの名無しさん
2007/12/02(日) 14:50:33substrの第2引数は取り出す長さだから原因は>>640だろ。
0682679
2007/12/02(日) 15:56:50http://www.katsakuri.sakura.ne.jp/src/up29579.bin.html
拡張子が変わってしまったんでhtmlに直してもらえたら見えます。
比較してみたいので、よかったら、BuildLogをupしてもらえないでしょうか?
おそらくBuildLogを比較すれば設定の差異が分かると思うので。。
>>681
状況は変わりませんでした。
0683デフォルトの名無しさん
2007/12/02(日) 16:13:310684デフォルトの名無しさん
2007/12/02(日) 16:23:02680だけど
http://www.katsakuri.sakura.ne.jp/src/up29580.bin.html
BuildLog、Upしたよ
ていうか激しくスレちがいな気もするが^^;
因みにおいらはVS2005のProですが変わらんと思うよ
0685デフォルトの名無しさん
2007/12/02(日) 16:28:38基本2で,1も3も可能な柔軟性
0686679
2007/12/02(日) 19:36:25デバッガだと落ちないんです。
>>684
ありがとうございます!早速比較してみましたが、
特にこの問題にかかわるような差異は見つけられませんでした・・
VS自体を再インストールしてSP1を当ててみましたが、
結果は同じでした。
ちょっともう手に負えないので残念ですが諦めようと思います。
ありがとうございました;;
0687デフォルトの名無しさん
2007/12/04(火) 12:32:35bitwise で論理積をとってくれるファンクタは用意されていませんか?
自分で用意する必要があるでしょうか?
用意すること自体は簡単なんですが、
標準的なファンクタがあるならそちらを使ったほうがいいかと思って。
boost::mpl も探してみたんですが、 bitand.hpp はみつかったものの
どうも自分がいとしているものとは違うようです。
0688デフォルトの名無しさん
2007/12/04(火) 16:52:01別のファンクタ f2 を適用したいと思っています。
これを実現する合成ファンクタを生成する簡単な方法があるでしょうか?
0689688
2007/12/04(火) 19:01:24これが C++0x に入ってくれたりするんだろうか。
そもそも copy_if が標準にないし。
0690デフォルトの名無しさん
2007/12/06(木) 17:18:24これを、大文字と小文字を区別しない辞書順に変えたいのですが
どうすればいいでしょうか?
0691デフォルトの名無しさん
2007/12/06(木) 17:34:17mapのテンプレート引数3番目にデフォルトのless<T>の代わりに入れる
0692デフォルトの名無しさん
2007/12/06(木) 18:14:39そのようにした場合、大文字と小文字を区別しないと、例えばTESTとtestがあった場合にはtestが2つみたいになってしまうんですか?
そうならないようにしたいんです。
説明下手ですいません
0693デフォルトの名無しさん
2007/12/06(木) 18:18:21A < a < B < b < C < c ...
みたいな順序で辞書順にすれば良い。
0694デフォルトの名無しさん
2007/12/06(木) 19:38:59教えていただけませんか?
0695デフォルトの名無しさん
2007/12/06(木) 19:43:37何を調べて結局何がわからなかったのかはっきりさせようよ。
・関数オブジェクトの作り方
・A < a < B < b < C < c ... の比較の仕方
0696デフォルトの名無しさん
2007/12/06(木) 19:56:42関数オブジェクトの作り方から調べたんですがよく分かりませんでした。
比較の仕方も具体的にどうやればいいのか教えていただけると助かります。
0697デフォルトの名無しさん
2007/12/06(木) 20:26:30operator() を持つクラスを作るだけだよ。
struct comp
{
bool operator()(const string& s0, const string& s1)const {
// 比較
// s0 が s1 より小さい(先にくる)ならtrue, そうでなければfalseを返す
}
};
map<string, int, comp> hoge;
実際の比較処理はSTLの範囲外だし文字列処理の初歩なのでがんばってくれ
0698デフォルトの名無しさん
2007/12/06(木) 20:36:12>0そのようにした場合、大文字と小文字を区別しないと、例えばTESTとtestが
>あった場合にはtestが2つみたいになってしまうんですか?
ならないから、>>693>>695は無視して安心してください。
0699デフォルトの名無しさん
2007/12/06(木) 22:58:27public:
bool operator()(const string& s1,const string& s2)const{
for(int i=0;i!=s1.length();i++)
toupper(s1[i]);
for(int i=0;i!=s2.length();i++)
toupper(s2[i]);
if(s1<s2)
return true;
else
return false;
}
};
いろいろ探しながらやってみたらこうなったんですけど
大文字の辞書順が先に出て、次に小文字の辞書順が出てきたままでした。
なにがいけないんでしょうか
0700デフォルトの名無しさん
2007/12/06(木) 23:25:28s1="abc"、s2="ABC" を入れたときの動作と
s1="ABC"、s2="abc" を入れたときの動作を考えてみろよ
それだとどっちも false が返ってくるじゃん
0701デフォルトの名無しさん
2007/12/06(木) 23:29:39調べたって、どういう風に調べたの?
「関数オブジェクト」で検索したら、定義と作り方が丁寧に書いてあるページばっか出てきたけど。
もしこれらを見てもわからなかったというのなら、つまりそれより詳細でわかりやすい説明を
このスレに書き込めって要求してることになるが、それは無茶というものだよ。
0702デフォルトの名無しさん
2007/12/06(木) 23:49:30public:
bool operator()(const string& s1,const string& s2)const{
for(int i=0;i!=s1.length()||i!=s2.length();i++){
if(toupper(s1[i])<toupper(s2[i]))
return true;
else if(toupper(s1[i])>toupper(s2[i]))
return false;
}
if(s1<s2)
return true;
else
return false;
}
};
これでどうでしょうか?
0703デフォルトの名無しさん
2007/12/06(木) 23:55:03toupperの使い方がまるで違う
for(int i=0;i<s1.length() && i<s2.length();i++)
{
unsigned char c,d;
c=s1[i];
d=s2[i];
if(toupper(c)!=toupper(d)) return toupper(c)<toupper(d);
else if(c!=d) return c<d;
}
return s1.length() < s2.length();
試してないから合ってるから知らん
0704デフォルトの名無しさん
2007/12/06(木) 23:56:150705デフォルトの名無しさん
2007/12/07(金) 00:06:18struct mixcomp_char : public std::binary_function<char, char, bool>
{
bool operator()(char x, char y) const
{
char lx = std::tolower(x);
char ly = std::tolower(y);
if(lx < ly) return true;
if(lx > ly) return false;
return x < y;
}
};
struct mixcomp : public std::binary_function<std::string, std::string, bool>
{
bool operator()(const std::string &x, const std::string &y)
{
return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end(), mixcomp_char());
}
};
0706デフォルトの名無しさん
2007/12/07(金) 00:27:54豆腐のカドにチンコぶつけて市ね
0707デフォルトの名無しさん
2007/12/07(金) 06:16:49で、どういう風に調べたの?
ここの住人を「ああ、こいつはちゃんと調べた上で質問してるんだな」と納得させられる調べ方は
まるでしてなかってことかな?
0708デフォルトの名無しさん
2007/12/07(金) 22:13:51分からないんなら出しゃばるなよ。
0709デフォルトの名無しさん
2007/12/08(土) 05:57:30で、どういう風に調べたの?
0710デフォルトの名無しさん
2007/12/08(土) 12:22:08調べるだけ時間の無駄
本屋行ってみれば情報量の高い有益な情報が手に入る。
(なかには使い物にならないものもあるが)
0711デフォルトの名無しさん
2007/12/08(土) 12:33:140712デフォルトの名無しさん
2007/12/08(土) 13:05:03ネットより比率がマシってだけで大して変わらん。
0713デフォルトの名無しさん
2007/12/08(土) 13:41:23そういうセリフは英語を使えるようになってから言え。
0714デフォルトの名無しさん
2007/12/08(土) 15:44:10#include <iostream>
#include <vector>
struct data {
data(int d) : num(d) {}
data(double db) : openprice(db){}
int num;
double openprice;
};
inline double comp(const data& lhs, const data& rhs) {
return lhs.openprice < rhs.openprice;
}
int main() {
std::vector<data> v;
v.push_back( data(1) );
v.push_back( data(0.1) );
v.push_back( data(2) );
v.push_back( data(0.2) );
v.push_back( data(3) );
v.push_back( data(0.3) );
double MAXOF = max_element(v.begin(), v.end(), &::comp)->openprice;
std::cout << MAXOF << std::endl;
return 0;
}
上記のコードではcomp比較関数でopenpriceの最大値を取得しているのですが、
openpriceの大小を比較して、戻り値としてその値と同じ構造体エレメントに属する
numの値を取得する場合の比較関数の書き方を教えてもらえないでしょうか。
(例えばこのコードの場合、3という値を望みます)
0715デフォルトの名無しさん
2007/12/08(土) 15:49:24比較関数はそのままで、
max_element(v.begin(), v.end(), &::comp)->openprice
を
max_element(v.begin(), v.end(), &::comp)->num
にすれば良い。
あと、そのコードは初期化のやり方がおかしい。
v.push_back( data(1) );
v.push_back( data(0.1) );
こうすると、
・num=1, openprice=不定
・num=不定, openprice=0.1
の二つのdataがvに入るが、意図としては
num=1, openprice=0.1
という一つのdataを入れたいんだよな?
0716デフォルトの名無しさん
2007/12/08(土) 15:54:28参照渡しのほうが内部状態を持ち続けたいときなどに
便利だと思うのでが.効率の面からですか?
もちろんファンクタが持つべき内部状態をカプセル化して
boost::shared_ptr などで持たせればいいのですが,
不思議に思ったので.
0717デフォルトの名無しさん
2007/12/08(土) 16:01:07単純に非 const 参照にすると、その場で生成したファンクタを渡せない。
const 参照にすると operator () に const が付いてないと使えない。
こんなとこじゃないの?
0718714
2007/12/08(土) 16:23:27どうもありがとうです、
>num=1, openprice=0.1
>という一つのdataを入れたいんだよな?
そうなんですが、これでいいのかな?
#include <algorithm>
#include <iostream>
#include <vector>
struct data {
int num;
double openprice;
data():num(0), openprice(0.0){}
};
inline double comp(const data& lhs, const data& rhs) {
return lhs.openprice < rhs.openprice;
}
int main() {
std::vector<data> v(3);
v[0].num = 1;
v[0].openprice = 0.1;
v[1].num = 2;
v[1].openprice = 0.2;
v[2].num = 3;
v[2].openprice = 0.3;
double MAXOF = max_element(v.begin(), v.end(), &::comp)->num;
std::cout << MAXOF << std::endl;
return 0;
}
でもこれだと、push_back()関数やイテレータを定義して、insert()関数での代入が出来
なくなるのかな?構造体が絡むと混乱してしまいます・
0719714
2007/12/08(土) 16:25:32×double MAXOF = max_element(v.begin(), v.end(), &::comp)->num;
○int MAXNUM = max_element(v.begin(), v.end(), &::comp)->num;
こうです
0720デフォルトの名無しさん
2007/12/08(土) 16:30:39引数を二つとるコンストラクタを作れば良い。
struct data {
data(int n, double db) : num(n), openprice(db){}
int num;
double openprice;
};
...
v.push_back( data(1, 0.1) );
0721デフォルトの名無しさん
2007/12/08(土) 16:32:160722デフォルトの名無しさん
2007/12/08(土) 16:40:47本題と関係ないが、特に理由がないならcompはboolを返すべき
0724デフォルトの名無しさん
2007/12/08(土) 21:53:47欧米のサイトは十分実用に耐えうるってこと?
0725デフォルトの名無しさん
2007/12/08(土) 22:08:110726デフォルトの名無しさん
2007/12/08(土) 22:36:56普段の情報集めはwebで
0727デフォルトの名無しさん
2007/12/08(土) 22:40:00予算消化とクレカポイントとアマゾンポイント狙いで
立替払いで買うもんじゃないのか。
0728デフォルトの名無しさん
2007/12/08(土) 22:52:31今はメイヤーズ先生のEffective STLを読んでる処だよ、先にSTL標準講座を買ったが
おさらい程度でざっくりと読んで、基本的なことで分からないことがあった場合、
付箋を貼りながら開いているな。
0729デフォルトの名無しさん
2007/12/08(土) 23:08:01本を見ながらコーディングするときって、どういう配置にすれば良いかいつも迷う。
今はキーボードの手前に本を置いて、キーボードを打つのと本を抑えるのを兼ねてるんだけど違和感ありすぎる。
0730デフォルトの名無しさん
2007/12/08(土) 23:15:12つ ほんたった
あんまり使ってないけど
0731デフォルトの名無しさん
2007/12/08(土) 23:19:49jisc.orgのJISX3014とかMSDNとか
0732デフォルトの名無しさん
2007/12/08(土) 23:25:41お、こんなのあるんだねー。
安いし試しに買ってみようかな。
0733デフォルトの名無しさん
2007/12/09(日) 09:34:52当然Assertionで落ちますけどこの例外がcatchできる、関数を教えてもらえないでしょうか?
0734デフォルトの名無しさん
2007/12/09(日) 09:36:54とか思い付きで言ってみる.
そんなことより,Java の Generic ってテンプレートと
同じくらい強力なものなの?教えてママ.
0735デフォルトの名無しさん
2007/12/09(日) 10:56:17> Throws: Nothing unless an exception is thrown by the copy constructor or assignment operator of T.
要素のコピーコンストラクタか代入演算子が例外投げなければ投げない
ってあるから、std::out_of_rangeは投げない。
存在しない要素のeraseは未定義動作。
0736733
2007/12/09(日) 12:00:28サンクス
ていうことは、空のvectorコンテナをerase()しないようにしないと、いけない訳で
要素が空か否か、判定するベターな方法は、どうしたらいいのかなぁ?
0737デフォルトの名無しさん
2007/12/09(日) 12:06:12つempty( )
0738733
2007/12/09(日) 12:53:16なんだよね、今find()関数の比較演算子(==)をオーバーライドして、専用のクラス作って
何となく上手くいきそうな悪寒です、なんかさerase()やempty()で空のvectorコンテナ操作するときって
注意が必要だね。
0739デフォルトの名無しさん
2007/12/09(日) 12:55:43それ以前に内容が破壊されてるんじゃないか?
0741デフォルトの名無しさん
2007/12/09(日) 13:08:44erase()はともかくempty()は注意する必要などないよな
0742デフォルトの名無しさん
2007/12/09(日) 13:18:47世の中には二つのコンテナしかない.
empty() か empty() でないか,だ.
0743733
2007/12/09(日) 13:31:39std::vector<data> v;
std::vector<data>::iterator iter;
iter = v.begin();
iter += 2;
if(!v.empty())
・・・・・・
こんな感じで、コンテナの特定Elementの有無を判定している、つもりだったんだけど
やり方が不味かったのかな?
find()関数のいオーバーロードでロジックは完成したんだけど、empty()関数使って
コンテナがぶっ飛ぶってのが凄く薄気味悪い!?((((;゜Д゜))).
0744デフォルトの名無しさん
2007/12/09(日) 13:37:56そもそも何のコードを書いてて落ちるだの飛ぶだの言ってるの?
> iter = v.begin();
> iter += 2;
> if(!v.empty())
こことか何をしたいのか意味がわからないし、
> コンテナの特定Elementの有無を判定している
という表現もよくわからない
0745デフォルトの名無しさん
2007/12/09(日) 13:38:52empty() で落ちるってのはなんかおかしいなぁ.
0746733
2007/12/09(日) 13:41:45こいういう事?
0747デフォルトの名無しさん
2007/12/09(日) 13:50:310748デフォルトの名無しさん
2007/12/09(日) 13:51:35emptyではないことを確認してから、beginとかを呼ぶんだよ。
0750733
2007/12/09(日) 13:59:51他のvectorや、自身(構造体)が何番目のキーが入力されて出来たデータとかの、
情報が入っています、まぁ管理テーブルのようなものと思った欲しい
なので、制約があって
1のキーを押下→v0番目に格納
2のキーを押下→v1番目に格納
3のキーを押下→v2番目に格納
4のキーを押下→v3番目に格納
5のキーを押下→v4番目に格納
6のキーを押下→v0番目に格納したベクトルを削除
7のキーを押下→v1番目に格納したベクトルを削除
8のキーを押下→v2番目に格納したベクトルを削除
9のキーを押下→v3番目に格納したベクトルを削除
10のキーを押下→v4番目に格納したベクトルを削除
こういう実装がしたかったわけよ、そこで最初vector
を固定長にしようとしたら、複雑になることに気付き、構造体に、何番目のキー入力で
出来たかって情報を付加し、削除する場合そのキーを検索して削除するってロジックに
落ち着いたって感じなんだよね、そこでキー入力後、管理テーブルベクターで
同じキー入力があった場合、はじくためにempty()を使いたかったんだけど、
上手くいかなかったんだよね
0751デフォルトの名無しさん
2007/12/09(日) 14:00:58>748
先に確認しとけ、とは思うけど、empty() でも begin() は呼んでも問題ないっしょ?
0752デフォルトの名無しさん
2007/12/09(日) 14:04:52ああ、まぁ、確かに。
end()の戻り値と同じものが呼ばれるだけで、扱いが正しければ害は無いよな。
0753デフォルトの名無しさん
2007/12/09(日) 14:05:57さっぱり分からない。多分コード見せてもらった方が…、でもやっぱり分からん気もする。
とりあえず、v0 〜 v4 はそれぞれ vector なのか?、vector の特定の位置なのか?
そもそも vector である必要があるんか?なんとなく、map 使えば良さそうな気がするんだが。
0754デフォルトの名無しさん
2007/12/09(日) 14:09:37そういうのは関係無いと思う。
>>743のコードが問題なのは、「中身をいじり始めてから、中身があるかどうかを確認している」ところ。
それって、飛び降りてからパラシュートを付けてるかどうか確認するようなものだよ。
0755デフォルトの名無しさん
2007/12/09(日) 14:34:54たぶんvectorの使い方をわかってなさそうなので、もっとシンプルな構造でテストすべきだと思うよ。
0756デフォルトの名無しさん
2007/12/09(日) 14:35:59もう全部貼れよw
0757デフォルトの名無しさん
2007/12/09(日) 14:56:380758デフォルトの名無しさん
2007/12/09(日) 15:13:080759デフォルトの名無しさん
2007/12/09(日) 17:12:13凄く薄気味悪い って、おまえが凄く薄気味悪いコード書いてるからだよ。map使え
0760デフォルトの名無しさん
2007/12/09(日) 22:13:38やっぱ未定義動作?
0761デフォルトの名無しさん
2007/12/09(日) 22:17:46不謹慎ながらワロタwww
0762デフォルトの名無しさん
2007/12/09(日) 22:26:47何でやねん
mergeは重複要素を除外しない
set_unionは重複要素を除外する
それだけの違い
0763デフォルトの名無しさん
2007/12/09(日) 23:49:30とした時に、array 中の指定した文字列と同じ文字列を持つ要素があるかどうかを調べる
関数を書きたいのですが、MyClass c ; とやって c との比較なら array.find()で出来るのですが
その中の一メンバー変数の比較をしなきゃならないんですが、このような場合はどうするのが
良いでしょうか?
0764デフォルトの名無しさん
2007/12/09(日) 23:50:030765デフォルトの名無しさん
2007/12/09(日) 23:54:070766デフォルトの名無しさん
2007/12/09(日) 23:55:47Thx!
0767デフォルトの名無しさん
2007/12/12(水) 23:33:260768デフォルトの名無しさん
2007/12/16(日) 16:56:46stack作成時にテンプレートのパラメタでvectorを使うように指定できるのは知ってます。デフォルトがdequeになっている理由がわからないです。
0769デフォルトの名無しさん
2007/12/16(日) 17:12:02vector は再確保が発生するときのコストが大きい。要素数の上限が分かっていれば
reserve() した vector を使うのがいいんだろうけど、どっちかというと要素数に対する
前提が無くても極端な特徴の無い deque をデフォルトにしとくのは妥当なところだと思う。
知ってのとおり vector も選べるしね。
0770デフォルトの名無しさん
2007/12/16(日) 17:20:46回答ありがとう。
典型的なdequeの、内部で抱えているバッファって単純なchar配列1つではない?
1つのchar[]をリングバッファとして使っているだけかと思っていました。
0771770
2007/12/16(日) 17:29:510772デフォルトの名無しさん
2007/12/16(日) 17:37:50ひとつの配列だと結局再確保が発生するときに O(n) になるから、計算量の要件が
満たせないでしょ。
STLport の実装見たら、固定サイズの配列を T* の配列で持ってた。
0773デフォルトの名無しさん
2007/12/16(日) 18:23:36えーと、メンバとして T** m_nodes; を持っていて、コンストラクタで
m_nodes = new T*[3];
m_nodes[0] = NULL;
m_nodes[1] = new T[N];
m_nodes[2] = NULL;
とかしておいて、push_front(x)されたらm_nodes[0]にもnew T[N]してやってそこに値xを覚えるとかでしょうか?
0774デフォルトの名無しさん
2007/12/16(日) 18:46:13特定の実装の詳細知りたければソース見れば? STLport だって言ってるんだし。
0775デフォルトの名無しさん
2007/12/16(日) 19:05:31vectorとdequeは末尾への要素追加に対する計算量の要求は同じで、vectorは配列で実装されているわけだが・・・
それについてはどうなの?
0776デフォルトの名無しさん
2007/12/16(日) 19:40:06vector の push_back は Sequence で定められる償却定数時間なのに対して
deque の push_back および push_front は定数時間とされている。
23.2.1 Class template deque の p1 より
> A deque is a kind of sequence that, like a vector (23.2.4), supports random access iterators. In addition,
> it supports constant time insert and erase operations at the beginning or the end; insert and erase in the middle
> take linear time.
0777デフォルトの名無しさん
2007/12/16(日) 19:40:24deque:
Inserting a single element either at the beginning or end of a deque
always takes constant time and causes a single call to the copy constructor of T.
vector の方はあくまで amortized な。
0778デフォルトの名無しさん
2007/12/16(日) 20:01:29deque先頭末尾はamortizedではないのか。それ、厳密にやろうとするとlistにしないと無理だったりしない?
STLPortの方法が常にconstantとは思えないのだが。
0779デフォルトの名無しさん
2007/12/16(日) 20:02:310780デフォルトの名無しさん
2007/12/16(日) 20:06:460781デフォルトの名無しさん
2007/12/16(日) 20:10:13適当にぐぐってみたが、
http://www.thescripts.com/forum/thread394684.html
http://www.hanecci.com/pukiwiki/index.php?Programming%2FC%2B%2B%2FSTL#ua0df688
このへんだと償却時間という解釈にしてしまっているね。
>>780
libstdc++については、
http://gcc.gnu.org/ml/gcc-bugs/2004-01/msg00028.html
ここで、not conformantでは?という投稿がされてる。これから読んでみる。
さて真相は。
0782デフォルトの名無しさん
2007/12/16(日) 20:20:22だと、amortized constant time って明示してあるね。むぅ。
0783デフォルトの名無しさん
2007/12/16(日) 20:21:06>23.1/2 says, "All of the complexity requirements in this clause are stated
>solely in terms of the number of operations on the contained objects."
これは知らなかった。ポインタ操作は定数回じゃなくてもいいのか
0784デフォルトの名無しさん
2007/12/16(日) 20:24:26ぜひ結論をまとめてくれw
0785デフォルトの名無しさん
2007/12/16(日) 20:31:48そうらしいね。でもそんなこといったら list の size() だって定数時間って言えちゃいそうな
気もするなぁ。
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#632
> We think that the complexity of the size() member of every container -- except possibly list -- should be O(1).
なんかおかしくね?
0786デフォルトの名無しさん
2007/12/16(日) 20:36:480787デフォルトの名無しさん
2007/12/16(日) 20:42:100788デフォルトの名無しさん
2007/12/16(日) 20:48:26コンテナの操作の計算量に関する要求は標準の23.1にあるわけだが、
ここで要求されている計算量は、操作に掛かる時間そのものについてじゃなくて、
「コンテナ内のオブジェクトを操作する回数」についてのものだと規定されてる
たとえばvectorに対するpush_backなら、要素のコピーコンストラクタを償却O(1)回呼ぶってことだ
で、libstdc++(たぶんstlportも)のdequeの実装だと、最悪O(n)回のポインタ代入が発生するけど、
要素のコピーコンストラクタは常に1回しか呼ばれないので、規格の要求するO(1)は満たしてることになる
0789デフォルトの名無しさん
2007/12/16(日) 21:06:020790デフォルトの名無しさん
2007/12/16(日) 21:22:14list に operator [] つけてもおk・・・になっちゃうよねぇ。
0791デフォルトの名無しさん
2007/12/16(日) 23:31:24O(N×M) じゃないですよと
そのほかは常識的に考えようね
0792デフォルトの名無しさん
2007/12/16(日) 23:39:320793デフォルトの名無しさん
2007/12/16(日) 23:43:080794デフォルトの名無しさん
2007/12/16(日) 23:49:03サイズくらい4バイト程度なんだから変数で覚えとけとおもうんだけど。
0795デフォルトの名無しさん
2007/12/16(日) 23:53:45変数で覚えてても splice() されたら変わってしまう。
0796デフォルトの名無しさん
2007/12/16(日) 23:55:120797デフォルトの名無しさん
2007/12/17(月) 00:04:52やっぱりある程度は常識で処理しないとだめなんじゃないかな
23.1/2 を常識的に読むと list<T>::operator[] が O(1) にはならない
0798デフォルトの名無しさん
2007/12/17(月) 00:08:24どうもありがとう
0799デフォルトの名無しさん
2007/12/17(月) 00:18:15環境依存でよいなら実測汁。
0800デフォルトの名無しさん
2007/12/17(月) 00:27:18いや、常識的に考えると list<T>::operator[] は O(n) だけど、 23.1/2 を
(常識的にでもなんでも)読んでしまえば O(1) と言えると考えざるをえないでしょ。
で、何かおかしいって話だよ。漁ったらこんなん出てきた。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1996/N0937R1.asc
あの記述が追加されたのは、要素型によっては実時間が定数時間にはならないという
問題を解決するため。つまり規格中の deque の要件がこの追記より前に定められていた
場合、単純に規格化の際に amortized を書き漏らした可能性があると。
>782 で挙げられた SGI のドキュメントに amortized が付いてることから考えても。
0801デフォルトの名無しさん
2007/12/17(月) 00:27:36俺にはそうは読めない
もしかしてそういう意図だったのかな、と想像することはできるけど
というか自分の主観を常識として語るのやめろよ
0802デフォルトの名無しさん
2007/12/17(月) 00:38:400803デフォルトの名無しさん
2007/12/17(月) 00:41:360804デフォルトの名無しさん
2007/12/17(月) 01:26:400805デフォルトの名無しさん
2007/12/17(月) 03:18:310806デフォルトの名無しさん
2007/12/17(月) 18:49:21俺も、かの有名なメイヤーズ先生が書いた、凄く薄っぺらの「Effective STL」を読んでいるが、、一向に脳内で咀嚼できず、前に進めない、
お前はどれ位で、この本を理解するのに、なん時間位かかった?
0807デフォルトの名無しさん
2007/12/17(月) 20:22:17少なくとも 23.1/2 は N2461 でもそのままだけど
0808デフォルトの名無しさん
2007/12/18(火) 02:28:55修正というからには、まずどこが間違っているのか挙げてもらおうか。
0809デフォルトの名無しさん
2007/12/18(火) 10:13:25vectorの特定の要素へのイテレーターを返してほしいばあい、どうすればいいのでしょうか。
vector<double> vec;
vec.resize(100);
vector<double>::iterator it;
hogehoge();
double d = vec[12];
//double d = *it; //この行で、一行上の記述と同じことをさせたい
この場合はどうすればいいのでしょうか?
どうせポインタだから、って参照をそのまま代入したらエラーになったし、
勇気を出してキャストしてみてもエラーになりました。
よろしくお願いいたします。
0810デフォルトの名無しさん
2007/12/18(火) 10:16:08it = vec.begin();
std::advance(it,12);とか。
0811デフォルトの名無しさん
2007/12/18(火) 10:22:33大変助かりました。
0812デフォルトの名無しさん
2007/12/18(火) 12:21:400813デフォルトの名無しさん
2007/12/18(火) 16:03:21class Test1
{public:
int base;
Test1()
{
base = 0;
}
void Add(int n)
{
base += n;
}
};
void hoge()
{
vector<int> v;
Test1 test;
v.push_back(1);
v.push_back(2);
v.push_back(3);
for_each(v.begin(), v.end(), test.Add); // ここでエラー
printf("%d", test.base);
}
これ解決するにはやっぱりイテレータでループ回すしかないんでしょうか。
上記のTest1クラスはあくまで例なので実際には別のクラスですけど。
0814デフォルトの名無しさん
2007/12/18(火) 16:06:58Boostにはそういうことをするためのbindというライブラリがある
標準にはない
0815814
2007/12/18(火) 16:10:33std::mem_funがあるじゃないか
0816デフォルトの名無しさん
2007/12/18(火) 16:11:59結果はtestに入らないよね?
Test1 result = for_each(〜略
0817デフォルトの名無しさん
2007/12/18(火) 16:13:000818813
2007/12/18(火) 16:19:23for_each(v.begin(), v.end(), test.Add);
↓
for_each(v.begin(), v.end(), mem_fun(&Test1::Add)(&test));
これでもやっぱりだめなんですよね。
0819デフォルトの名無しさん
2007/12/18(火) 16:30:07これでできた
0821デフォルトの名無しさん
2007/12/18(火) 16:36:420822813
2007/12/18(火) 16:41:100823デフォルトの名無しさん
2007/12/18(火) 19:22:330824デフォルトの名無しさん
2007/12/18(火) 21:21:04for_each(v.begin(), v.end(), boost::bind(&Test1::Add, &test, _1));
0825デフォルトの名無しさん
2007/12/18(火) 22:10:22Effective C++買ってみた。
0826デフォルトの名無しさん
2007/12/19(水) 02:37:040827デフォルトの名無しさん
2007/12/19(水) 02:58:230828デフォルトの名無しさん
2007/12/19(水) 03:53:080829デフォルトの名無しさん
2007/12/19(水) 21:02:38自動的に参照渡し,test にしたら自動的に
値渡しになるの?
boost::bind すげぇ〜
んで,boost::lambda とどちら使えばいいんだ?
教えて!
0830デフォルトの名無しさん
2007/12/19(水) 21:52:36boost::lambda::bind
0831デフォルトの名無しさん
2007/12/19(水) 22:13:27_1 とかが両方にあって混乱する.
0832デフォルトの名無しさん
2007/12/19(水) 22:35:25{
private:
typedef boost::function<int, int> Functor;
Functor calc;
int num;
public:
Test(const string& str) : num(1)
{
map<string, Functor> funcs;
funcs["plus"] = boost::bind(&Test::plus, this, _1);
funcs["multiply"] = boost::bind(&Test::multiply, this, _1);
this->calc = funcs[str];
}
int operator()(int n) { return this->calc(n); }
private:
int plus(int n) { return this->num + n; }
int multiply(int n) { return this->num * n; }
};
こういうのって有り?
0833デフォルトの名無しさん
2007/12/19(水) 22:43:45俺なら普通にifで切り分けていく。
あるいはそのmapを静的に持つ。
0834デフォルトの名無しさん
2007/12/19(水) 23:00:03悪い設計の見本みたいな例ではあるね
0835デフォルトの名無しさん
2007/12/20(木) 00:58:42パフォーマンスで問題が表面化しなければそれでいいんじゃないかね。
意図通りに動くのであれば。
0836デフォルトの名無しさん
2007/12/20(木) 01:08:29数千の文字列と入力文字列を比較するうまいやりかたって標準C++にあるっけ。
よさげなアルゴリズム(←ヘッダ名ではなく一般名詞)でもいいけど、参考までに教えて。
0837デフォルトの名無しさん
2007/12/20(木) 01:12:260838デフォルトの名無しさん
2007/12/20(木) 01:51:11完全ハッシュの計算はgperfとかで事前にやっとくとしても、与えられた文字列ハッシュするのって時間かかるんでない?
もっと速い方法無いかな。
0839832
2007/12/20(木) 01:51:49ちなみに、コンストラクタ呼び出しはプロセス開始直後に数十回程度で、
作ったインスタンスはプロセス終了まで使い回すつもり。
0840デフォルトの名無しさん
2007/12/20(木) 09:39:21>>832の書き方だと、設定時に常に lower_bound が走る上にメモリ確保の回数も多くなるから、
無駄だと思うんだよね。if にくらべてどれだけ高速化するか微妙。
どうせなら、vector に、キーと値のペアを設定して、あらかじめ挿入するサイズを reserve してから
push_back でどんどん追加していき、1回ソートしてから、lower_bound で検索したほうが高速化すると思う。
0841デフォルトの名無しさん
2007/12/20(木) 10:56:17使ったことないけどトライとかどうよ。
>>832はmapを使い捨てるから効率は期待できない。
ただ俺は>>835に同意。性能が問題にならないなら書き易い方法を選ぶべき。
0842デフォルトの名無しさん
2007/12/20(木) 12:14:20だったら O(N) でも素直にループで比較するほうがマシなんじゃないの?
map やソート済み vector を全部のインスタンスで使いまわすようにすれば、
素直なループより効率よくなりそうではある。
0843デフォルトの名無しさん
2007/12/20(木) 12:59:51int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
DialogBox(hCurInst, "DLGBOX", NULL, (DLGPROC)DlgProc);
return 0;
}
BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam , Boy *boy)
{
char boy[256],ookisa[128],namae[128];
switch (msg )
{
case WM_INITDIALOG: //ダイアログボックスの初期化
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK://OKボタンが押されたら
GetDlgItemText(hDlg, IDC_FAIL1, namae, (int)sizeof(namae));
GetDlgItemText(hDlg, IDC_FAIL2, ookisa, (int)sizeof(ookisa));
wsprintf(boy, "名前を%sに、大きさを%sに変更しました", namae, ookisa);
MessageBox(hDlg, boys, "変更したぷぃ(>o<)b", MB_OK);
strcpy(boy->name,namae);
boy->value[64] = ookisa[64];
EndDialog(hDlg, IDOK);
return TRUE;
}
return FALSE;
}
return FALSE;
}
0844デフォルトの名無しさん
2007/12/20(木) 13:02:25一応コンパイルまでは出来るんですが、ダイアログボックスに文字、数字を入力し、OKをクリックするとアプリケーションエラーになってしまいます。
どなたか教えていただけないでしょうか?
0845デフォルトの名無しさん
2007/12/20(木) 13:31:08スレ違い。↓ここがいいかな?
Win32API質問箱 Build60
http://pc11.2ch.net/test/read.cgi/tech/1196874830/
0846845
2007/12/20(木) 13:31:430847デフォルトの名無しさん
2007/12/20(木) 14:30:43「素直にループで比較」の計算量の検討が抜けてない?
>>841
トライ(trie)って、map<string>のred-black treeと比べて
どういう利点があるの?いまいちわからん。この例限定で
いいから教えて。
0848デフォルトの名無しさん
2007/12/20(木) 14:34:56単に連想配列として使う場合は、赤黒木の様に平衡を保つ並べ替え処理が行われないので速い。
0849デフォルトの名無しさん
2007/12/20(木) 14:37:31じゃぁ、
"aaa......aaa0001"
"aaa......aaa0002"
..
"aaa......aaa9999"
みたいなデータをつっこむとtrieだと遅くなるのかな。
0850デフォルトの名無しさん
2007/12/20(木) 15:06:59それだと赤黒木でも相当遅くなりそうだ。
文字列比較のたびに毎回大量のaを比べないといけないからな。
0851デフォルトの名無しさん
2007/12/20(木) 15:38:08うーん。
0852デフォルトの名無しさん
2007/12/20(木) 16:02:43先頭にP文字の'a'があって、それにQ文字のランダム(R種類から選ぶ)な文字が続く文字列を
N個つっこんで、10万回検索した。挿入の時間は計ってない。
trie: 4 map: 14 0 10 5000 256
trie: 29 map: 17 0 50 5000 256
trie: 8 map: 25 40 10 5000 256
trie: 2 map: 9 0 10 5000 32
trie: 10 map: 13 0 50 5000 32
trie: 9 map: 18 40 10 5000 32
左から、trieでの時間、mapでの時間、P、Q、N、R。
上から二番目、完全ランダムな50文字の場合を除けばtrieが速いな。
ただし上から二番目ではtrieが相当メモリを使ってて、N=10000では動かせなかった。
0853デフォルトの名無しさん
2007/12/20(木) 19:17:30いや、それはtrieの方が速いだろ
0854デフォルトの名無しさん
2007/12/20(木) 20:59:16えーと、なんでだ?
0855デフォルトの名無しさん
2007/12/20(木) 23:52:10挿入の時間も知りたい。平均m文字程度の大量の文字列を高速にソートしたいんだよね。
std::mapに突っ込んでiteratorが速いならそうするし、他の方法があるなら知りたい。
trieとかいうのも興味ある
単にvector<string> s;をsort(s.begin(),s.end())のほうが速かったりする?
それとも何か特殊なデータ構造が適当なのかな
0856デフォルトの名無しさん
2007/12/21(金) 00:02:52一般的なstd::mapを使うのは自明な方法の中では最悪だと思うけど・・・
0857デフォルトの名無しさん
2007/12/21(金) 00:15:300858デフォルトの名無しさん
2007/12/21(金) 05:59:50string& func()
{
std::string s = "text";
return s;
}
という書き方は正しい?(stringじゃ無くてVectorなんかも同じ?)
0859858
2007/12/21(金) 06:25:32とにかくfunc()内で動的に生成したstringオブジェクトを返すのは
どうすればいい?
普通にnew?
それだと解放はいつすべき?
0860デフォルトの名無しさん
2007/12/21(金) 06:28:360861858
2007/12/21(金) 07:12:38どーも。で、解放は何時してやればいい?し忘れても問題ない?
あと、こんなのも駄目なの?
string instr = "text";
string outstr;
copy(instr.begin(), instr.end(), outstr.begin());
0862デフォルトの名無しさん
2007/12/21(金) 07:43:04局所変数の参照を返してはいけないのは普通の変数でも
STL系でもすべて同じ。
そのまま実体を返して不都合がなければ string 返しな。
>>861
試してないから間違ってるかもしれんが
copy(instr.begin(), instr.end(), insert_iterator( outstr ) );
だとおも。もしくは先に outstr.resize( instr.length() ); とか。
0863858
2007/12/21(金) 08:46:12レスさんくす
VSの混合モードで見ると>>858はstringのコンストラクター2回、
デストラクターが1回よばれてる。warningは出るけど、実は問題ないんじゃない?
とか思ったり。
>>861に関してはoutstrをstringの代わりにstringstream使えばいいみたいだけど、
(insert_iteratorはstringに使えない?)
シンプルな>>861のパターンが駄目ってのは美しくないよな。
0864デフォルトの名無しさん
2007/12/21(金) 09:05:08問題ある。たまたま動いてるだけだ。
copy使うなら、
copy(instr.begin(), instr.end(), back_inserter(outstr));
だな。
0866デフォルトの名無しさん
2007/12/21(金) 09:20:05キーを指定して削除する erase(key) のような呼び出しもできますよね?
このときマップに key が登録されていない場合には
例外が出るのですか?out_of_range が投げられるのかなぁ
とおもってずっと catch して待っているのですが,
いまだになんの音沙汰もありません.
0867866
2007/12/21(金) 09:23:46size_type
erase(const key_type& x);
Deletes the element with the key value x from the map,
if one exists. Returns 1 if x existed in the map, 0 otherwise.
でした.どう見ても戻り値です.
本当にありがとうございました.
0868デフォルトの名無しさん
2007/12/21(金) 09:29:29insert_iteratorはテンプレート名であって関数名じゃないから、そのまま呼び出すのには使えない。
outstr.begin()を使うと、outstrの要素を上書きしながらコピーという意味になる。
outstrは空なので、上書きしようとしたら未定義動作が起こる。
back_inserter(outstr)なら、「outstrの末尾に追加」だから問題ない。
0869858
2007/12/21(金) 10:47:42上書きと末尾に追加を分ける必要があるのかなんだよなー
書き込む対象がstringなんだから、自動で増やしてくれてもいいと思うんだけど。
まぁ仕様の話しても仕方ないのでこのへんで。
0870デフォルトの名無しさん
2007/12/21(金) 10:55:47std::copy は *(oitr++) = *(iitr++); を繰りかえしてる。
イテレータを *( itr++ ) = ?; として使った場合に
begin() で得られるイテレータはこんな動作。
*(ptr++) = ?;
back_inserter で得られるイテレータはこんな動作(等価になる)。
container.push_back( ? );
0871デフォルトの名無しさん
2007/12/21(金) 11:39:35もうちょっと勉強すれば、なんでそうなっているのかとか、
自分がどれだけ不自然なことを要求してるのがわかると思うよ。
0872858
2007/12/21(金) 11:49:14memcpy同様の動作ってこと?
でも本来はストリームとして動作することが期待されるわけで、
内部の実装はどうであれ、取得したイテレーターはシーケンシャルな
アクセスが可能でないと困る。
人間的にはこっちのほうが自然だよ。
0873デフォルトの名無しさん
2007/12/21(金) 12:14:31無限長のsequenceというconceptを新たに作れと?
0874デフォルトの名無しさん
2007/12/21(金) 12:23:06outstr.assign(instr.begin(), instr.end())ってこと?
それともinsert?
0875デフォルトの名無しさん
2007/12/21(金) 12:26:36「人間的」とか宗教みたいなこと言い出したから、もうこれ以上話が深くはならんだろう。
0876デフォルトの名無しさん
2007/12/21(金) 12:29:250877デフォルトの名無しさん
2007/12/21(金) 12:47:12> でも本来はストリームとして動作することが期待されるわけで、
そのために stringstream なんてものがあるわけだが…
何を期待してるか知らんが string はそもそも char* のラッピングだぜ?
0878858
2007/12/21(金) 13:14:01どうしてもSTLみたいなのに高度な抽象化を求めてしまうのよ。
>>873
stringって勝手に拡張されないの?
>>874
練習用なので意味は無い。
>>877
stringが固定長で変化しないっていう仕様なら文句は言っていない。
0879デフォルトの名無しさん
2007/12/21(金) 13:22:08string s("foo");
s[4] = 'a';
とかやったら未定義。
operator[]で範囲チェックすらしないほど効率重視の設計だから、
イテレータへの書き込みで自動伸長しないのも自然だと思う。
0880デフォルトの名無しさん
2007/12/21(金) 13:30:55string func()
{
std::string s = "text";
return s;
}
0881デフォルトの名無しさん
2007/12/21(金) 13:34:17またC++が難しくてスクリプトに逃げた奴が叩いてただけか。
世間ではもう冬休みかぁ…
0882858
2007/12/21(金) 13:51:39じゃぁ
str = "abc" (abcやdefは実際はもっと長い文字列とする)
str += "def"
の場合は内部で再アロケーションするんじゃないの?
0883デフォルトの名無しさん
2007/12/21(金) 13:58:56そうだよ
0884デフォルトの名無しさん
2007/12/21(金) 14:13:440885デフォルトの名無しさん
2007/12/21(金) 14:17:56879は「 operator[] () では拡張されない」ということを書きたかったんじゃないかな。
いまその辺が話題なわけだから。拡張するしかないときには、当然拡張されるよ。
vector や string の operator[] に例えばレンジチェックが入ったら、
使える場面が大分限定されちゃうよね。
「範囲を超えるかもしれないのでチェックしてほしい」というレアな使い方以外では
ポインタやただの配列より強烈に遅いだけでメリット無いんだから。
0886デフォルトの名無しさん
2007/12/21(金) 14:29:20って,そういう話じゃないの?
0887デフォルトの名無しさん
2007/12/21(金) 14:32:01back insert iteratorでないから
一方std::backinserter(Container)はback insert iteratorを返すのでok
0888858
2007/12/21(金) 14:37:35ptr++してる時([]も含む)はレンジチェックは一切行われず、
意図的にデータを追加する処理を呼び出したときのみレンジチェックがされて
足りなければ追加されるってことでいいのかな?
で、copy動作は追加では無く単にptr++動作でしかないために
動的に拡張されず、したがって>>861みたいな書き方が出来ないと。
でもiteratorに対して読み込みは出来るが書き込みは出来ないって言う
非対称性はどうも綺麗じゃないと思うな。まぁ思うだけにしておくけど。
0889デフォルトの名無しさん
2007/12/21(金) 14:38:280890デフォルトの名無しさん
2007/12/21(金) 14:40:33抽象化もなにも、抽象化されたcopyというアルゴリズムの意味をおまえさんが理解していなかった(しようとしない)だけだろ。
C++の<algorithm>ではコピーの本質は>>870に書いてあるとおり純粋な情報の移動の
ことで、メモリ割り当てはまた別の話とされている。
どこからコピーするか、どこへコピーするかはイテレータによって抽象化されている。
ストリームとしての動作が当然なんて言う狭い考え方の基には作られていない。
そういう動作が欲しければ、別途そういうライブラリを作るなり調達するなり、
委員会に提案するなりすればいいんじゃないか。copy_back_insertとか(笑)
0891デフォルトの名無しさん
2007/12/21(金) 14:40:48std::string in("abc");
std::string buf("uvxyz");
std::copy(in.begin(), in.end(), buf.begin());
/* bufは"abcyz"になる */
0892デフォルトの名無しさん
2007/12/21(金) 14:41:070893デフォルトの名無しさん
2007/12/21(金) 14:42:56> 意図的にデータを追加する処理を呼び出したときのみレンジチェックがされて
> 足りなければ追加されるってことでいいのかな?
いや、back_inserter は末尾に追加するだけ。
レンジチェックもクソもない。「末尾に追加」する。
> で、copy動作は追加では無く単にptr++動作でしかないために
> 動的に拡張されず、したがって>>861みたいな書き方が出来ないと。
yes。同様の罠が transform とかにもあるから注意。
> でもiteratorに対して読み込みは出来るが書き込みは出来ないって言う
> 非対称性はどうも綺麗じゃないと思うな。まぁ思うだけにしておくけど。
ダウト。書き込みは上書き扱い。
配列でポインタ使ったときとちょうど対称になるでしょ?
他の言語との対象性は知らんがw
0895デフォルトの名無しさん
2007/12/21(金) 14:46:01{
:string *s = new string ;
*s="text";
return s;
}
でいいんじゃないの
0896858
2007/12/21(金) 14:51:39抽象化という言葉の捕らえ方が俺とは逆だね。
ストリームからストリームへデータを移動させる、ってのが抽象的な表現で
イテレーターがどのような挙動をするかは実装依存。
俺はその実装がどうなっているかわかってないから困ってるのだ。
>>893
いつレンジチェックされるんだろうw
.netのmarshal系なんて>>861の書き方に近かったと思うけど。
いやまぁいろいろ勉強になったよ。
0897デフォルトの名無しさん
2007/12/21(金) 14:52:24back insertion sequenceじゃないのでback_inserterの引数にできないはずなんだけど
ISO/IEC 14882:2003ではback_inserter(Container)になってる
どっちを信用すればいいんだ・・・ってそりゃ規格の方か
もしかしてこのリファレンスって信用ならんしろものなの?
0898デフォルトの名無しさん
2007/12/21(金) 14:53:25{
string *s = new string ;
*s="hoge";
return *s;
}
0900デフォルトの名無しさん
2007/12/21(金) 14:56:17delete しないでいい処理なんかでは使えるかもね。
0901デフォルトの名無しさん
2007/12/21(金) 15:01:24>>896
str.begin()で取ったイテレータもちゃんとストリームになってる。
このストリームにデータを流し込むのはstrの要素を上書きするのと同じ。
だから、このストリームには流せるデータ数に制限がある。
で、back_inserter(str)で取ったイテレータはこれとは別のストリームで、
これにデータを流し込むのはstrに要素を追加するのと同じ。よって無制限に流せる。
これで一貫してると思わないか?
0902デフォルトの名無しさん
2007/12/21(金) 15:04:240903デフォルトの名無しさん
2007/12/21(金) 15:04:560904デフォルトの名無しさん
2007/12/21(金) 15:05:52別の意味で使わない方がいいよ。
0905デフォルトの名無しさん
2007/12/21(金) 15:07:090906デフォルトの名無しさん
2007/12/21(金) 15:13:30string a;
a.reserve(70000000);
string().swap(a);
int n;scanf("%d",&n);
}
で解放できるけど、newと参照の場合は解放できない 消し方は無いのかも
0907デフォルトの名無しさん
2007/12/21(金) 15:14:21でもいまのところ意味は同じにみえる
0908デフォルトの名無しさん
2007/12/21(金) 15:18:27main(){
string a;
a.resize(100000000);
cout<<a.size();
string().swap(a);
int n;scanf("%d",&n);
}
こっちは解放しない
string& func(){
string *s = new string;
(*s).resize(100000000);
return *s;}
main(){
string a=func();
cout<<a.size();
string().swap(a);
int n;scanf("%d",&n);
}
0909858
2007/12/21(金) 15:21:05大丈夫だよw
ただ、別のストリームが登場してくるのがいやだっただけ。
一貫性なら単一のイテレーターでいろいろ出来るほうが楽だと思うが、
実装がパフォーマンスとの兼ね合いでそうなっているならまぁ仕方が無いのかと。
>>904
俺は単に流し込むものくらいの意味で使ってた。
0910デフォルトの名無しさん
2007/12/21(金) 15:21:13string& func(){
string *s = new string;
(*s).resize(100000000);
return *s;}
main(){
string a;
a=func();
string().swap(a);
delete(&a);
int n; scanf("%d",&n);
}
0911デフォルトの名無しさん
2007/12/21(金) 15:29:00string& func(){
string *s = new string;
cout<<"s="<<s<<endl;
(*s).resize(100000000);
*s="hoge";
return *s;}
main(){
string a;
cout<<"a="<<&a<<endl;
a=func();
cout<<"a="<<&a<<endl;
cout<<a<<endl;
int n; scanf("%d",&n);
}
0912デフォルトの名無しさん
2007/12/21(金) 15:33:13string& func(){
string *s = new string;
(*s).resize(100000000);
return *s;}
main(){
string *a;
a=&func();
string().swap(*a);
int n; scanf("%d",&n);
}
0913デフォルトの名無しさん
2007/12/21(金) 15:34:50「光学センサー付き絶対安全金槌ただし一回振るのに10秒かかる」と「石」、
しかなかったら、釘を打つのには結局は石を使っちゃうでしょう。
だったら普通の金槌を用意するのが妥当、と。
0914デフォルトの名無しさん
2007/12/21(金) 15:37:04これってもしかしたらGUI環境用のおまじない?
だったらgetchar()だけで済むだろうに……
つーか、なんか思いっきり勘違いしている気がする。
複数レスに跨っているから指摘するのは面倒だから遠慮するけど。
0915デフォルトの名無しさん
2007/12/21(金) 17:12:540916C++脳
2007/12/21(金) 17:34:40ってコワいですね。
0917デフォルトの名無しさん
2007/12/21(金) 18:28:27まったくだ、だれがDeleteしてるんだっていうね
0918デフォルトの名無しさん
2007/12/21(金) 19:28:550919デフォルトの名無しさん
2007/12/21(金) 19:35:530920デフォルトの名無しさん
2007/12/21(金) 21:02:030921デフォルトの名無しさん
2007/12/21(金) 22:12:45「規則でtr1使えません><」
「自分で作れカス」
0922デフォルトの名無しさん
2007/12/21(金) 22:28:52using tr1::shared_ptr;
}
0923デフォルトの名無しさん
2007/12/21(金) 22:30:250924デフォルトの名無しさん
2007/12/22(土) 00:52:07> 抽象化という言葉の捕らえ方が俺とは逆だね。
そういう問題ではないだろう。
何かを抽象化するときに、視点が違えば別の解になる。
STL は挙動で抽象化してるから、君の視点と違うせいで、おかしな設計に見えるのだろう。
STL の設計思想に慣れるしかない。
0925デフォルトの名無しさん
2007/12/22(土) 21:54:31範囲外アクセスになったときは素直に落ちて欲しいなあ
0926デフォルトの名無しさん
2007/12/23(日) 01:55:44え?find使えって?
0927858
2007/12/23(日) 09:52:22抽象化に視点はあまり関係ないと思うぞ。
上での例を使うと、copyという操作は概念としてAからBへデータを複製することになる。
そして、copyという語自体、それ以上の意味を持っていない。
しかし、C/C++のmemcpyなどでは
・コピー元A、コピー先B共にメモリ上のデータであること。
・コピー先Bに必要な領域が確保されていること。
という条件が付く。(memcpyの仕様)
そして、上のほうで書いたcopy操作もmemcpyと同じ条件が付く(ので合ってるのか?)
これは抽象的概念を具現化する過程で(つまりは実装すること)
その実装方法によりいくつかの条件、制限が付加される。
視点が違うと感じられるのは、この実装過程での思想の違いによるものでしかない。
だから各条件に応じて数種類のイテレーターを使い分けなければいけなくなる。
抽象化というのは、このような条件、制限を出来るだけ撤廃してオリジナルの
概念をあらゆる場面で適用出来るようにすること。
たとえば、copy fileA, fileBを実装する場合、Bが自動的に拡張されないように
実装したら馬鹿だと言われるぞ。
0928858
2007/12/23(日) 10:04:48シンプルな関数名はシンプルな動作が期待されるわけで、その関数がどのような実装で
あるのか知る必要もないくらい、あらゆる場面で使用できるってのが理想的。
0929デフォルトの名無しさん
2007/12/23(日) 10:12:18>そして、上のほうで書いたcopy操作もmemcpyと同じ条件が付く(ので合ってるのか?)
合ってない。例えば標準入力を標準出力にコピーする操作もcopyで書けるけど、
この操作はどちらの条件も満たしていない。
自動的に拡張されないのはstringの仕様(もっといえばstring::beginの仕様)であって、
copyはそんなことには関知しない。
0930デフォルトの名無しさん
2007/12/23(日) 10:14:160931デフォルトの名無しさん
2007/12/23(日) 10:35:14> 抽象化に視点はあまり関係ないと思うぞ。
設計によってインターフェースが違ったりするよね?
それを、抽象化の視点が違うから、と説明するのはおかしいと思う?
例えば GUI の実装がいくつもあって互いにかけ離れたものがあるけど、同じように抽象化したのにインターフェースが別物になったと思う?
なら、抽象化という単語の意味を取り違えていると思うよ。
俺は、挙動を iterator で分類する抽象化はなかなかいいと思うけどね。
0932デフォルトの名無しさん
2007/12/23(日) 11:40:38> そして、copyという語自体、それ以上の意味を持っていない。
わかってんじゃん。
それなのになぜ、
> そして、上のほうで書いたcopy操作もmemcpyと同じ条件が付く(ので合ってるのか?)
なんてトンチンカンなことが出てくるのかがわからん。
そんな条件は無いし、ましてやコピー先が自動的伸縮できることという条件も無い。
そんな制限があったら使えるシチュエーションが限られてしまうじゃないか。
それは実装の詳細だから包み隠されているべきと言うだろうが、
それはあるレイヤーの上にいる人の視点。
その実装の中にも設計があることをお忘れ無く。
伸縮するバッファを実装する人がcopyを使えなくなってしまうでしょ。
0933デフォルトの名無しさん
2007/12/23(日) 11:53:53その「同じ値」って言うのは operator < だけで判定してるんですか?
それとも別途 operator == が定義されていなくてはだめですか?
0934デフォルトの名無しさん
2007/12/23(日) 12:10:370935デフォルトの名無しさん
2007/12/23(日) 12:45:140936デフォルトの名無しさん
2007/12/23(日) 12:54:57!( a < b ) && !( b < a ) なら a == b
0937858
2007/12/23(日) 12:59:50言っていることがよくわからん。
プログラム的な抽象化ってのは、一度細分化された後で
同様の概念を持つものを再統合するようなイメージ。
インターフェイスの違いなどはまだ細分化されたままの次元において出てくる話。
なのでそういう部分を指して話をするのであれば、抽象化の話とは違うと思う。
>>932
本当にcopyに関しては何も条件は無い?
イテレーターの正体がメモリのポインターであっても、ファイルポインターであっても
STLのコンテナであっても?
そして全て同様の動作が期待されると考えてよいの?
>>870は間違い?それともイテレーター次第?イテレーターに依存するのであれば、
それも条件のうちだよ。
>それはあるレイヤーの上にいる人の視点。
逆に言えばC++の人はそういう細かい実装中心で思考してるわけで、
そもそも俺が言っている条件のようなものは空気のようなもので
普段は意識してないのかもしれない。
0938デフォルトの名無しさん
2007/12/23(日) 13:03:220939858
2007/12/23(日) 13:12:20知っているということがSTL(boostも)を使いこなす前提となっているのかどうかってこと。
知らないよりは知っているほうがいいだろうが、実装を知らないまま使うことが
不可能に近いレベルで無理なのか?というところを知りたい。
0940デフォルトの名無しさん
2007/12/23(日) 13:16:190941デフォルトの名無しさん
2007/12/23(日) 13:32:38dequeとか。
0942デフォルトの名無しさん
2007/12/23(日) 13:40:41あるクラスPointがあり
コンストラクタは2つの引数を受け取るものです。Point(int x,int y){・・・}
vectorを使用してPointクラスのポインタのリストを作成したいのですが
どのようにすればよいのでしょうか?よろしくおねがいします。
以下 厳しい突っ込み覚悟のメモ書き
vector<Point *> test;
↑もし このような形であっているとしたら、その後、値を入れるにはどうすればよいのでしょうか?
test@push_back(@);
↑一応このような形かも とは考えて見ましたが(@はどうすればいいのか検討もつきませんorz)
0943デフォルトの名無しさん
2007/12/23(日) 13:48:08copyが内部で
*iter++ = ???;
みたいな操作をやってるってのは実装の詳細でもなんでもなくて、copyのインタフェースの一部だ。
そもそも出力イテレータというのは、*iter = ???の代入が意味を持つ型のこと(もうちょっと制限があるけど)で、
copyというのはこの操作を入力イテレータが指す範囲のそれぞれの要素について行うものと定義されている。
ただし、copyの内部が
*iter++ = ???;
なのか
*iter = ???;
iter++;
なのか
*iter = ???;
++iter;
なのかは本当に実装の詳細だけどな。
0944デフォルトの名無しさん
2007/12/23(日) 13:48:270945デフォルトの名無しさん
2007/12/23(日) 13:50:19後置++はありえんだろ。効率的に。
0946デフォルトの名無しさん
2007/12/23(日) 13:56:22今はcopyの実装が実際にどうなってるかを問題にしてるわけじゃなくて、
copyの実装をどこまで知っている必要があるかの話をしている。
たとえ後置++を使ったcopyの実装があったとしても、正しい出力イテレータを与えれば
前置++を使ったcopyの実装と同じ挙動を示すというのが重要。
0947858
2007/12/23(日) 14:09:24いや、そうでなくて。
少なくとも*iter++と書くこと自体、メモリ上のポインターであることを前提としている。
イテレーターがファイルのポインターだとすると
概念的には
file[filepos++] = ???
のように表せるはず。
(内部の実装では当然メモリ上のコピー動作は発生するが、
その後ファイルへの書き込みまで行って操作が完結するので
実装を全く意識せずに表すとこうなる)
だから、本当にメモリのポインター操作しか行わないのか
上記のような高度な操作もしているのかどうかということ。
もし、メモリ上のポインターのみであれば、それは実装を意識していることになるんだけど。
0948デフォルトの名無しさん
2007/12/23(日) 14:19:26>少なくとも*iter++と書くこと自体、メモリ上のポインターであることを前提としている。
してないよ。
この式には二つの演算子(後置++と前置*)が出て来るけど、どっちもオーバーロードできる。
ファイルへの書き込みを行うイテレータなら、
*iter++ = ???;
と書いたときに、内部的に
file[filepos++] = ???;
を行うようなオーバーロードを行なっている。
0949デフォルトの名無しさん
2007/12/23(日) 14:20:00それに付随するニアミスを防ぐためにライブラリを使うものだと思ってる。
中身を知る労力すら惜しい輩は一生 ruby でも書きなぐってればいいのに。
0950デフォルトの名無しさん
2007/12/23(日) 14:22:130951デフォルトの名無しさん
2007/12/23(日) 14:26:29別に知らなくても使えるんだから、そうやって使いたい奴が使うのを止める理由はないじゃん。
0952デフォルトの名無しさん
2007/12/23(日) 14:26:51ちなみにpointerはrandom access iteratorとしての用件をみたす
0953デフォルトの名無しさん
2007/12/23(日) 14:28:030954858
2007/12/23(日) 14:30:16どのようなオブジェクトでも処理ができるので、その方が物作り的効率はいいんだよね。
実はrubyで特定処理が遅いからC++化しようとしてるだけだったりするw
0955デフォルトの名無しさん
2007/12/23(日) 14:33:40>>948は無視か?
とりあえず>>858にC++を教えた奴(か書籍)は、
イテレータがそもそも++と*で成り立ってるってことを紹介するべきだな
# include <iterator>
# include <iostream>
int main(void)
{
std::ostream_iterator<int> oi(std::cout, "\n");
*oi++ = 1;
*oi++ = 2;
*oi++ = 3;
}
0956858
2007/12/23(日) 14:33:43boostまで理解しようとしたら、みっちりやって半年か1年くらいかかりそうだ。
0957デフォルトの名無しさん
2007/12/23(日) 14:36:33抽象化が機能してるとかしてないとか言えるのかと。
ただ知らない、分かってないだけじゃないかと。
まぁ、何でも混ぜるrubyの弊害なのは分かるんだけどさ…
初心者にとっては機能の単位が分かりづらくなるから
あんまり勉強には向かないんだよなぁ。
0958デフォルトの名無しさん
2007/12/23(日) 14:37:56プログラミングってそうやって習得するものじゃないの?
0959858
2007/12/23(日) 14:39:13見落としてたよw
ファイルの扱いに関しては理解した。
後はまた元に戻るけど、copyのようにイテレーター間のデータの移動についてはどう?
ファイルストリーム→string
vector→list
のようなコピーも定義されてるの?
0960デフォルトの名無しさん
2007/12/23(日) 14:42:32それも全部copyでできる。
追記か挿入か上書きかで出力イテレータを使い分けるのも同じ。
0961858
2007/12/23(日) 14:47:04なるほど、てことはイテレーターの使い分けが肝であり、
そのイテレーターが何故複数存在しているか理解すれば一番早いと理解してOK?
て言うかイテレーター含め型多すぎだよ。
0962858
2007/12/23(日) 14:50:08stringとstringstreamが独立して必要な理由を教えてもらえるとありがたい。
実装上の都合という理由以外で。
stringって変更不可なオブジェクトでは無かったと思うけど。
0963デフォルトの名無しさん
2007/12/23(日) 15:00:18個々の対象(ファイルストリームとかvectorとかstringとか)のそれぞれに、
専用のcopyが定義されてるわけじゃないぞ。
copyの実装は一つで、ひたすら
*出力イテレータ++ = *入力イテレータ++;
のようなことを繰り返すだけのものとして定義されてる。
どこに書き込むか、どうやって書き込むか(追記か上書きか、とか)を知っているのはイテレータだけで、
それに応じて++と*をオーバーロードしている。
>>961
うん、それでいい。
あと、練習としてアルゴリズムを一つ書いてみたら良いと思う。
入力を一つおきに捨てながら出力にコピーするskip_copyとかどうだろうか。
で、それがファイルにもstringにもlistにも適用できることを確認する。
0965デフォルトの名無しさん
2007/12/23(日) 16:15:30> stringとstringstreamが独立して必要な理由を教えてもらえるとありがたい。
両者が概念からして全く別のものだから。
というか、文字列を扱うということ以外に共通点が見つからないんだけど。
0966965
2007/12/23(日) 16:19:12string は文字列を”保持”して”扱う”ためのもの。
stringstream はクラス階層を見ても分かる通り、
そもそも「データを流し込むもの=stream」であって、
流し込む対象が文字列なだけ。
対象がファイルになると iostream になるし。
0967デフォルトの名無しさん
2007/12/23(日) 16:45:09vc8ではreferenceはcontainer::referenceになってましたが
0968858
2007/12/23(日) 16:53:40うそ臭い説明だなw
じゃぁ単なるstringはストリームとしての特性を全く持っていないのか?
先頭から1文字ずつアクセスできるし、文字列の後ろに文字を追加することも出来る。
cout <<に対して出力も出来るし、stringのイテレーターからの>>も出来たんじゃなかった?
stringもストリームとしての要素は持っていることになると思うけど。
たとえば、stringオブジェクトは1度作ると変更できない、というような特性があるのなら
別のストリームオブジェクトが必要になるのは分かるが、そうでは無い。
だから、やはり単にstringstreamがstream系のオブジェクトを継承しているかどうかに
拠るというのが理由で、実装上の都合のように見えるのだけど。
0969デフォルトの名無しさん
2007/12/23(日) 17:00:56> じゃぁ単なるstringはストリームとしての特性を全く持っていないのか?
yes
> 先頭から1文字ずつアクセスできるし、文字列の後ろに文字を追加することも出来る。
配列も先頭から1文字ずつアクセスできるけどストリームか?
mrealloc で配列の後ろに追加できるけどポインタもストリームになるのか?
> cout <<に対して出力も出来るし、stringのイテレーターからの>>も出来たんじゃなかった?
int も cout に << できるけど int ってストリームか?
つまり、ストリームの理解が間違ってる。
0970858
2007/12/23(日) 17:14:40って言ったのはそっちだよw
その定義であれば、配列もintもストリームだし。(ストリーム化可能と言うべきか)
0971デフォルトの名無しさん
2007/12/23(日) 17:19:12> 「データを流し込むもの=stream」
> って言ったのはそっちだよw
どういう理解をすればああいうレスが出来るのか不思議…
cout << var1 << var2 << var3・・・
^^^^^
こういう風にデータを流し込むことができる対象ってことなんだけどなぁ。
0972デフォルトの名無しさん
2007/12/23(日) 17:30:37まずstringはコンテナだというデザインを受け入れないと何でもアリになるんじゃ?
0973デフォルトの名無しさん
2007/12/23(日) 17:41:03流し込む先がどうなるかについては言及していない。
stringの+=は「末尾に追加する」の意味であって、「流し込む」わけではない。
0975デフォルトの名無しさん
2007/12/23(日) 17:49:03あー。「流し込む”もの”」ってことか。
なるほど。そういう誤解されるとは思いつかなかった。スマン。
0976デフォルトの名無しさん
2007/12/23(日) 17:50:11cout, cinの使い方考えたらわかるだろうに
0977858
2007/12/23(日) 18:08:11極端な話、vectorクラスで<<をオーバーロードしちゃえば
vec << newobject
なんて書き方も可能だよ。違いはそういうところじゃないはず。
0978デフォルトの名無しさん
2007/12/23(日) 18:30:510979デフォルトの名無しさん
2007/12/23(日) 18:43:200980デフォルトの名無しさん
2007/12/23(日) 18:45:580981デフォルトの名無しさん
2007/12/23(日) 18:57:230982デフォルトの名無しさん
2007/12/23(日) 19:01:350983デフォルトの名無しさん
2007/12/23(日) 19:24:06C++相談室でやればいいってことだよ。
0984デフォルトの名無しさん
2007/12/23(日) 19:35:18std::stringstreamは、std::basic_stringstream<char>のtypedefで、
basic_stringstream<>は、その基底クラスを辿っていくとbasic_ios<>に辿り着くのでストリームである。
つまり、
> だから、やはり単にstringstreamがstream系のオブジェクトを継承しているかどうかに
> 拠るというのが理由で、実装上の都合のように見えるのだけど
俺もこうだと思う。stringに、ストリームにする皮を被せたのがstringstream。
0985デフォルトの名無しさん
2007/12/23(日) 19:36:580986デフォルトの名無しさん
2007/12/23(日) 19:53:23このおバカ全開な流れは
0987デフォルトの名無しさん
2007/12/23(日) 19:55:020988デフォルトの名無しさん
2007/12/23(日) 20:23:31どうもその説明に違和感がある。
stringを包んでいるのはstringbufで、stringstreamはストリームバッファとして
stringbufを使っているだけにすぎん。
0989デフォルトの名無しさん
2007/12/23(日) 20:27:37同意。
HDD の代わりに string を使ってる iostream みたいなものだと認識してるが。
0990984
2007/12/23(日) 20:40:15つまり俺の説明がへたくそなだけだ。すまん
0991デフォルトの名無しさん
2007/12/23(日) 21:32:250992デフォルトの名無しさん
2007/12/23(日) 23:02:40multimap<int,string,greater<int> >と宣言するとエラーが起きるのですが
なぜなんでしょうか?
なぜかtypedefするとコンパイラを通ります。
0993デフォルトの名無しさん
2007/12/23(日) 23:08:120994デフォルトの名無しさん
2007/12/23(日) 23:19:190995992
2007/12/23(日) 23:29:28a.cpp:41: error: no matching function for call to `std::multimap<int,
std::string, std::greater<int>, std::allocator<std::pair<const int,
std::string> > >::insert(int&, std::string&)'
C:/mingw-jp/include/c++/3.3.3/bits/stl_multimap.h:326: error: candidates are:
typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>,
std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator
std::multimap<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const
_Key, _Tp>&) [with _Key = int, _Tp = std::string, _Compare =
std::greater<int>, _Alloc = std::allocator<std::pair<const int, std::string>
>]
C:/mingw-jp/include/c++/3.3.3/bits/stl_multimap.h:350: error:
typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>,
std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator
std::multimap<_Key, _Tp, _Compare, _Alloc>::insert(typename
std::_Rb_tree<_Key, std::pair<const _Key, _Tp>,
std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator,
const std::pair<const _Key, _Tp>&) [with _Key = int, _Tp = std::string,
_Compare = std::greater<int>, _Alloc = std::allocator<std::pair<const int,
std::string> >]
0996デフォルトの名無しさん
2007/12/23(日) 23:57:34insertの呼び出しが間違ってるだけのように見えるが。
0997デフォルトの名無しさん
2007/12/24(月) 03:14:47もしかしたら見落としてる基本が掘り起こされてるかもしれないから、おさらいしておくことにする。
何も掘り起こされてなかったら、次スレで何も無かったようにROMる。
新たな発見があったら、、恥かしいからやっぱ何事も無かったかのようにROMる。
そして、酔っ払ってるから今日は寝る。
0998858
2007/12/24(月) 03:45:15【C++】STL(Standard Template Library)相談室 8
http://pc11.2ch.net/test/read.cgi/tech/1198435319/
0999デフォルトの名無しさん
2007/12/24(月) 03:56:48スレ立て乙
1000デフォルトの名無しさん
2007/12/24(月) 04:04:3410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。