【C++】template 統合スレ -- STL/Boost/Loki, etc.
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG以下のスレッドを統合するスレです。
STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/test/read.cgi/tech/1026793823/
【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
関連スレ、その他リンクは >>2-5 あたりに。
0800デフォルトの名無しさん
NGNGhttp://user.ecc.u-tokyo.ac.jp/~g940455/wp/boost/index.html
http://www.emaki.minidns.net/Programming/tools/Boost/
http://www.kmonos.net/alang/boost/
0801デフォルトの名無しさん
NGNGttp://www.kmonos.net/alang/boost/
0802デフォルトの名無しさん
NGNGiteratorは基本的に自分が属するContainerがどれであるかを知らないし、
Containerは基本的に自分の上のiteratorがどこかに存在しているかどうかを
知らないし、
algorithmは自分が操作する対象がどんなsequenceであるかを知らない…
という形にすることで可能な限り一般性を高める、というのが
STLの方向性だと思うので、↓の是非は別にして、
> コンテナが反復子の状態数を保存してるときは
> 反復子を操作(削除)するときに
> 管理しているコンテナに通知して処理するほうが望ましい結果が得られる。
これはSTLに求める性質としてはお門違いではないかと。
0804794
NGNG一般的な反復子にはもちろん同意だが、
コンテナ内のtypedef(または定義)されたiteratorを
削除するときは違う。
a.insert(a2.begin()) -> は問題ない
a.erase(a2.begin()) -> a2側に通知が必要
STLの性質を求めてるんじゃなくて、
結果が正しくなることを求めてる。
0805デフォルトの名無しさん
NGNG0806デフォルトの名無しさん
NGNG自分で勝手に自分がどのコンテナオブジェクトに属しているかを知っている
イテレ−タを使ってアクセスされるリストクラスでも作って使っとけアホ。
0807デフォルトの名無しさん
NGNG> listのeraseで自分のコンテナ以外の反復子を削除できるようなのですが、
自分のコンテナ以外の反復子を指す要素は削除「できない」。実装によっては
たまたま削除されてしまうかもしれないが、その辺りの動作は未定義。
それをふまえて。
> a.insert(a2.begin()) -> は問題ない
a.insert(a2.begin, value) か? a.erase(a2.begin()) と同じ程度には問題あるだろう。
> 結果が正しくなることを求めてる。
sqrt( "弐" ) とやったら "1.41421356" と返すのが正しい結果だ、
と主張してそれを求めてるのに等しいことは自覚してるか?
無論、sqrt( "弐" ) と同じでコンパイルエラーになるとか、最悪でも
実行時エラーになったら嬉しいのは確かだし、(だからSTLPortの
Debug版とかはかなり重宝されている。) staticメンバ関数を使って
list<T>::erase(a2.begin()) と書けるiterator/container はそれなりに便利だろう。
が、それはSTLの範疇じゃない。
0808807
NGNG○反復子の指す要素
0809デフォルトの名無しさん
NGNGひとこと余計なんだよ。
カスが。
0810デフォルトの名無しさん
NGNG保護違反が発生するのですが、STLはExeをまたがって使用できないのですか?
環境は .Net STLはMS製です。
0811デフォルトの名無しさん
NGNGMSの作るのDLL/EXEは、MSVCRT.DLLを使わない限り、ヒープを個別に
持つことになる。片方でnew/mallocしたものを他方でdelete/freeすると
当然おかしなことになる。
MSVCRT.DLLを使うか、またがってnew/deleteをしないよう
気をつけるしかない。
0812デフォルトの名無しさん
NGNGlist<N>::iteratorの比較をしたい場合には、どのようにしたら良いのでしょう?
list<N>::iterator il; // Nは適当なクラス
set<list<N>::iterator> lset;
lset.insert(il); // 必要なilを適宜追加する。ここでの重複を省きたい。
(とりあえずコンパイル通すために)以下のようにiteratorの比較をしています
bool operator < (const std::list<N>::iterator lhs, const std::list<N>::iterator rhs)
{ return &(*lhs) < &(*rhs); }
g++(2.96〜3.2)では通るのですが、Intel Compiler(icc)では、
# error: no operator "<" matches these operands
# operand types are: const std::list<N, std::allocator<N>>::iterator
# < const std::list<N, std::allocator<N>>::iterator
とはじかれてしまいます。
どうすれば解決するかご指摘いただけないでしょうか?
0813デフォルトの名無しさん
NGNGstruct compare_dereferenced_address : std::binary_function< bool , Iterator , Iterator >
{
  bool operator () const ( const Iterator& lhs , const Iterator& rhs )
  { return &(*lhs) < &(*rhs); }
};
set<list<N>::iterator,compare_dereferenced_address<list<N>::iterator> > lset;
Interl Compiler 持ってないから、実験はできないけど、
とりあえず行儀よくしてやったら治らないかね?
0815812
NGNG治りました。ありがとうございます。
binary_functionにあまり馴染んでないせいか(必要にかられて本を調べる程度)
set<list<N>::iterator,compare_dereferenced_address<list<N>::iterator> > lset;
こんな風に宣言できることすら思いつきませんでした。
0816デフォルトの名無しさん
NGNG0817813
NGNG0818812
NGNGset<list<N>::iterator,compare_dereferenced_address<list<N>::iterator> > lset;
とすると確かに通るのですが、挙動不審です。
どうも元の set<list<N>::iterator> との型の互換で失敗しているようです。
この辺のデバッグが非常に面倒なプログラムなので、
できれば素の、set<list<N>::iterator>のまま通したいところです。切実に、、
せっかく
bool operator < (const std::list<N, std::allocator<N> >::iterator lhs,
const std::list<N, std::allocator<N> >::iterator rhs)
{ return &(*lhs) < &(*rhs); }
と、operator用意しているのに、何で使ってくれへんの? と悲鳴をあげつつ
以下がエラーメッセージ全文となります。うざったくてすんません。
どうか、もちょっとだけアドバイスを下さいませ。
/opt/intel/compiler70/ia32/include/functional(134): error: no operator "<" matches these operands
operand types are: const std::list<N, std::allocator<N>>::iterator
< const std::list<N, std::allocator<N>>::iterator
return (_Left < _Right);
^
detected during:
instantiation of "bool std::less<_Ty>::operator()
(const _Ty &, const_Ty &) const [with _Ty=std::list<N, std::allocator<N>>::iterator]"
at line 471 of "/opt/intel/compiler70/ia32/include/xtree"
instantiation of "std::_Tree<_Traits>::_Pairib std::_Tree<_Traits>::insert(const std::_Tree<_Traits>::value_type &)
[with _Traits=std::_Tset_traits<std::list<N, std::allocator<N>>::iterator,
std::less<std::list<N, std::allocator<N>>::iterator>,
std::allocator<std::list<N, std::allocator<N>>::iterator>, false>]"
0819デフォルトの名無しさん
NGNG> とすると確かに通るのですが、挙動不審です。
> どうも元の set<list<N>::iterator> との型の互換で失敗しているようです。
失敗じゃネェよ。そいつらは違う型だ。
set<list<N>::iterator>を使ってたところで全部同じ型を使うように汁。
0820デフォルトの名無しさん
NGNG多分
template<typename T> void function( tmpl<T> t ) { ... }
という定義があれば tmpl<T> t; function(t); で見つけられるけど、
template<typename T> void function( tmpl<T>::type t ) { ... }
では tmpl<T>::type t; function(t); では見つからないはず。
# スマートポインタを ptr<T>::shared とか ptr<T>::auto とか ptr<T>::locked
# とか書きたいけど書けねぇなぁ、という議論で見かけた気がする。
ので素直に、
1: set<list<N>::iterator> を(名前は適切なものをつければいいが) set_of_N_iter に置換
2: typedef set<list<N>::iterator,compare_dereferenced_address<list<N>::iterator> >
set_of_N_iter;
しとけ。
あるいは、iteratorの比較関数をtemplateにしないで
bool operator<( const list<N>::iterator& i, const list<N>::iterator& j ) { ... }
と一個一個書いていけばいいような気もするが。
0821812
NGNG>set<list<N>::iterator>を使ってたところで全部同じ型を使うように汁。
ごもっともです。
それでうまくいかなかったのは、やはり元のコードがbuggyだったせいかと。
>820
>bool operator<( const list<N>::iterator& i, const list<N>::iterator& j ) { ... }
>と一個一個書いていけばいいような気もするが。
これはどうも無理でした。
>では tmpl<T>::type t; function(t); では見つからないはず。
つまり、見つけられた(コンパイラ)の方がたまたまだったというわけでしょうか……
>ので素直に、 (中略) しとけ。
はい、そうしますわ。こつこつバグ治します。
0822デフォルトの名無しさん
NGNGttp://groups.yahoo.com/group/boost/files/
とか見ていると、smart_ptr とか singleton とか
いい感じに Loki を取り込んでいってますな。
あと、次期 boost::lexical_cast 萌え
ところで、ここのコードって勝手に使っていいのかな?
0823デフォルトの名無しさん
NGNG素朴な疑問なんだけどさあ、iteratorってお互いの大小関係って
比較できたっけ?
==か!=でしか比較できなかったような気がするんだが。
0824デフォルトの名無しさん
NGNG1.std::set<Elem, Op>
2.std::set c(Op)
のどちらかでしか比較基準は指定できないよ。これを使わず
operator< を定義しても使ってはくれない。
0825デフォルトの名無しさん
NGNG> 素朴な疑問なんだけどさあ、iteratorってお互いの大小関係って
> 比較できたっけ?
だから812氏は苦労して { return &(*lhs) < &(*rhs); } なんて奇怪な
比較関数を作ってるんじゃねーの?
> のどちらかでしか比較基準は指定できないよ。これを使わず
> operator< を定義しても使ってはくれない。
set<T> とやったら比較ポリシーは std::less<T> になるから、
operator < が呼ばれる。つーか、キミ、勉強し直せ。
0826820
NGNG追実験。。
> >bool operator<( const list<N>::iterator& i, const list<N>::iterator& j ) { ... }
> >と一個一個書いていけばいいような気もするが。
Comeau のオンラインコンパイラで試してみたら、
namespace std {
bool operator<( const list<int>::iterator& i, const list<int>::iterator& j ) { ... }
}
とstdの中に突っ込んで置いたら一応コンパイルは通ったぞい。
猛烈に行儀が悪いので、止めた方が無難だが。
0827デフォルトの名無しさん
NGNG0828812
NGNG通りました! まさにピンポイントなアドバイス!
>猛烈に行儀が悪いので、止めた方が無難だが。
よそのコンパイラでお行儀悪くするためにはコツが必要なのですね。
ありがとうございます。
>827
なるほど。const list<N>::iteratorではなく、const vector<N>::iteratorの場合、
operator < を作る必要がなかったので不思議に思っていました。
勉強になりました。
0829デフォルトの名無しさん
NGNG0830デフォルトの名無しさん
NGNGもうstlport使わなくてよくなるかな
0831デフォルトの名無しさん
NGNG0832デフォルトの名無しさん
NGNG0833デフォルトの名無しさん
NGNG0834デフォルトの名無しさん
NGNGstl なんか使いませんとも。
0835デフォルトの名無しさん
NGNG抜き出すにはどうすればよいですか?
片方に含まれる、両方に含まれる、どちらにも含まれる、で
処理を分けるようなこともしたいです。
0836デフォルトの名無しさん
NGNGソート済みなら
std::set_union()
std::set_intersection()
std::set_defference()
が使えるかと。
0837デフォルトの名無しさん
NGNG片方にのみ含まれる - std::set_difference()
どちらにも含まれる - std::set_intersection()
両方の集合の和 - std::set_union()
但しこれらのアルゴリズムは必ず std::vectorを sort() してから
呼び出さなければならない。
0838デフォルトの名無しさん
NGNG0839836
NGNG0840仕様書無しさん
NGNG0841デフォルトの名無しさん
NGNG両方あった方が良い(w
0842デフォルトの名無しさん
NGNG勘違いしている馬鹿発見。
0843デフォルトの名無しさん
NGNGVC7にSTLportを導入した、つもりなんですが
どうも上手くいっていないみたいです。
ちゃんとSTLportが使われているかチェックする方法はないですか?
インクルードディレクトリを切り替えてlistの性能比較とかしても差がないし、
iostreamもSTLport版を使うようにし他場合、
#define _STLP_USE_DYNAMIC_LIB してできた実行ファイルを
Dependency Walkerで調べたらstlport_vc745.dllが表示されると
思っていたんですが、表示されませんでした。思い違いでしょうか?
インストールが上手くいっていないだけですか?
0844デフォルトの名無しさん
NGNGstd の変わりに _STL ネームスペースを使って正常にコンパイル
できるかどうかチェックする。
0846デフォルトの名無しさん
NGNGSGI系のアダプタである _STL::compose1 とか _STL::compose2 が
コンパイルできるか確かめてみる方法もあるよ。
0847デフォルトの名無しさん
NGNGfor(int i=0;i<10;++i) cin >> x[i];
を for で回さないでなんか algorithm 使って出来ないですかね?
std::vector x(10);
std::transform(x.begin(), x.end(), x.begin(), bind1st(std::mem_fun(&std::istream::operator>>), &std::cin));
で逝けるかなぁと思ったんですけど、
no matching function for call to `mem_fun(<unknown type>)'
と gcc-3.2.1 に言われてしまって…
まぁ完全に趣味なんで別に for で回せばいいんですけどね。
0848デフォルトの名無しさん
NGNG#include <iterator>
std::copy_n( std::istream_iterator<T>(cin), x.size(), x.begin() );
0849848
NGNG0850デフォルトの名無しさん
NGNGやってみたけど11個数字を入れないと終了しないよ。
STLport。
0851デフォルトの名無しさん
NGNG多分それがだめなのは、operator>>の戻り値型がstd::istreamだから
だろう。
0852デフォルトの名無しさん
NGNGファンクタを作ったらだめかい?
template <typename T>
struct input {
T operator()(T& t) {
std::cin >> t;
}
};
int main()
{
std::vector<int> x(10);
std::transform(x.begin(), x.end(), x.begin(), input<int>());
std::copy(x.begin(), x.end(), std::ostream_iterator<int>(std::cout, " "));
}
0853848
NGNGおー、ほんとだ。istream_iterator って operator* じゃなくて
コンストラクタと operator++ のタイミングで読まれるのか。使いにくいな。
0854デフォルトの名無しさん
NGNGtemplate <typename T>
struct Input {
T operator()(T& t) {
std::cin >> t;
return t;
}
};
0855デフォルトの名無しさん
NGNGtemplate< typename T >
struct input_from_cin
{
T operator () ()
{
T temp;
cin >> temp;
return temp;
}
};
int main()
{
vector< int > v;
generate_n( back_inserter( v ) , 10 , input_from_cin< int >() );
copy( v.begin() , v.end()
, ostream_iterator< int >( cout , " " ) );
}
0856847
NGNG>>848
copy_n は知らなんだです。gccのSTLにはあるみたいなんで良さそうですね。
でも確かに >>853 のような事に
>>851
それだと <unknown type> なんですか?そもそもこのエラーメッセージが良く分からんっす。
ちゃんと iostream は include してるから未知って事は無いと思うんですが…
>>852
まぁもちろんファンクタ作ればいいんですが、なんとなく一行野郎で行きたかったんで…
>>855
そうなんですが、一行野郎を目指したら個数を指定する為に無理矢理行き着いたのが
transform でして…可読性はゼロですけどね(w
0857デフォルトの名無しさん
NGNGとか言ってみる。
0858デフォルトの名無しさん
NGNG(・∀・)ソレダ!!
0860デフォルトの名無しさん
NGNG0861デフォルトの名無しさん
NGNG0862デフォルトの名無しさん
NGNG0863tantei
NGNG●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
●ストーカー対策
社会問題ともなっているストーカーを撃退致します!!
その他人生相談からどんなお悩みでも解決いたします!!
直通 090−8505−3086
URL http://www.h5.dion.ne.jp/~grobal/
メール [email protected]
グローバル探偵事務局
0864デフォルトの名無しさん
NGNG●浮気素行調査
VB、JAVA、C#、COBOLの浮気を調査致します!!
●トロイ、ウィルス発見
あなたのプログラムに誰かが仕掛けているかも!!
●行方調査
行方不明になっている変数の消息を調査致します!!
●関数名からアドレス割り出し
.dll、.objからアドレスを割り出し致します!!
●バグ対策
社会問題ともなっているバグを撃退致します!!
その他設計相談からどんなお悩みでも解決いたします!!
直通 http://pc2.2ch.net/tech/
URL http://www.2ch.net/
メール [email protected]
2ちゃんねるプログラム板
0865STL初心者
NGNG0866デフォルトの名無しさん
NGNG0867デフォルトの名無しさん
NGNGstd::vector<bool>は過去の実装の遺物です。
固定でもよければstd::bitset、可変長が必要ならboost::dynamic_bitset
を使いましょう。
0868デフォルトの名無しさん
NGNGただし普通のvectorだと思って使うと細かいところで問題が起こる。
あと1要素が1bitで実装されてる保証はない。
0869デフォルトの名無しさん
NGNGbool型へのポインタが取得できません。
0870STL初心者
NGNG固定長じゃないんですよー
>可変長が必要ならboost::dynamic_bitset
情報どもです。あとで調べます。
>>868
>ただし普通のvectorだと思って使うと細かいところで問題が起こる。
「細かいところ」って具体的にどんなことなんでしょう?
ビットにパックされているために bool *p = &vecBool[x]; とかができないとか?
push_back(), insert(), erase() と 値の参照、設定さえできればよいのだが
このあたりのことを詳しく説明したドキュメントってどこかにないのかなぁ
それともSTLのソースを読むしかないの?
0871STL初心者
NGNGvector<bool> は1要素を1ビットで表現するという特別な処理をしているようには見えませんでした。
ということは VC++6.0 であれば vector<bool> を使っても問題ないと理解してよろしいのでしょうか?
0872デフォルトの名無しさん
NGNG使うコンパイラに関係なくstd::vector<bool>を使っても問題ないが、
メンバ関数が返す値はboolへのリファレンスでなくてプロキシである
ことを知っておく必要がある。
>>870さんも言っているように、
bool* p = &vecBool[x]; のようなコードがコンパイルできない。
0873デフォルトの名無しさん
NGNG> ビットにパックされているために bool *p = &vecBool[x]; とかができないとか?
当たり。できません。
んでもって、これができないモノは正確には「コンテナではない」んだそうです。
よって「vector<bool>はSTLコンテナではない」が成り立つとかなんとか。
なんとなく心配なら、deque<bool>を代用品に選んどくのもいいかも。
0874デフォルトの名無しさん
NGNG例えばVC++6 ProのSP5なら、<vector>の245行目以下で
boolをunsigned intにパックしてるが。
0875STL初心者
NGNGあれっ、ほんとだ。
でも vector<bool> vb; と宣言し vb.push_back(true); を実行しても
class vector<_Bool, _Bool_allocator> が利用されていないように
見えるが・・・
0876STL初心者
NGNGvector<bool> vb;
vb.push_back(true);
bool *pb = &vb[0];
をコンパイル実行してみると、問題ないようだぜ。
パックするには何かおまじないがいるのかな?
0877デフォルトの名無しさん
NGNGstd::vector<bool, std::allocator<bool> >か、
bool専用のアロケータが使われるかは処理系依存で
さらにbool専用のアロケータの名前も規定されてない
0878デフォルトの名無しさん
NGNGbjamとかって標準のインストールパスにしか対応していないのですか?
0879デフォルトの名無しさん
NGNGグローバルでSTL宣言すると12バイトのメモリリークが起きるようなんですが、
これの解消法ってどうすればいいんですか?
0880デフォルトの名無しさん
NGNGよーわからんけど、「12バイトのメモリリーク」 はどうやって確かめたの?
0881デフォルトの名無しさん
NGNGconst charT *mes()
{
return "message";
}
質問です
mes<char>(); //はOK
mes<wchar_t>(); //だめ、理由はわかってます。でもどうしたらいいのでしょうか
0882デフォルトの名無しさん
NGNG0883デフォルトの名無しさん
NGNGtemplate <>
const wchart_t *mes()
{
return L"message";
}
0884デフォルトの名無しさん
NGNGああ、そりゃそうですね・・・
ども
0885879
NGNGあ、すみません、説明不足でした。
list<int> hoge;
という風にグローバルで宣言して、そのまま終了すると
12バイト漏れる、ということで。
メモリリークを調べるのには
_CrtDumpMemoryLeaks()
を使いました。
0886デフォルトの名無しさん
NGNG0887デフォルトの名無しさん
NGNGコンストラクタとデストラクタが呼び出されるタイミングと
_CrtDumpMemoryLeaksが呼び出されるタイミングを考えてみろ
0888デフォルトの名無しさん
NGNGusing namespace std;
try{
locale::global(locale("2ch"));
} catch(exception &e) {}
これでリーク起こす。
0889デフォルトの名無しさん
NGNGVC6はC Runtimeのソース付いてるから直せるぞ
0891デフォルトの名無しさん
NGNG#include<sstream>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
int main()
{
basic_stringstream<wchar_t> S;
const char c[]="圭";
size_t size = mbstowcs(NULL,c,0);
vector<wchar_t> tmp(size+1);
wstring data;
mbstowcs(const_cast<wchar_t*>( &tmp[0] ),c,size);
*(static_cast<volatile wchar_t*>( &tmp[0] )+size) = L'\0';
S << &tmp[0];
S >> data;
wcout << data;// VC6だと\, VC.NETだと圭
}
0892デフォルトの名無しさん
NGNG> mbstowcs(const_cast<wchar_t*>( &tmp[0] ),c,size);
> *(static_cast<volatile wchar_t*>( &tmp[0] )+size) = L'\0';
ここのキャストは要らないと思うんだけど。
mbstowcs(&tmp[0],c,size);
tmp.back() = L'\0';
これでいいはず。
んで、試してみたけど。
wcout << &tmp[0] << endl;// 「圭」
wcout << S.str() << endl;// 「圭」
wcout << data << endl;// なにもでない
> S >> data
こいつがうまくいかないみたい。
原因は追いきれなかった。
0893デフォルトの名無しさん
NGNGRedo/Undoの機能をつけるために
ポインタをポインタの配列で管理しようとしているのですが
配列のサイズを決めて新しい要素を入れると
古いものから順に消していってくれるような都合のいい
クラステンプレートってないですか?
0894デフォルトの名無しさん
NGNG>setlocale(LC_ALL,"Japanese");を忘れてました。
ライブラリ側の問題ぽいので
S.str()で回避して使っていこうと思います。
ありがとうございました。
0895デフォルトの名無しさん
NGNGstd::queueのラッパーでいいんじゃねーの。
0896デフォルトの名無しさん
NGNGリングバッファを実現するコンテナアダプタはSTLの解説で幾つか見たことあるが、
公開されてるものはない気がするから自分で作ったほうがはやそう。
0898デフォルトの名無しさん
NGNG方法がわかる方はいらっしゃいませんか?
いらっしゃいましたら、方法を教えてください。
まさか stlport_vc6.lib をバイナリ・エディット?
■ このスレッドは過去ログ倉庫に格納されています