【C++】template 統合スレ -- STL/Boost/Loki, etc.
レス数が900を超えています。1000を超えると表示できなくなるよ。
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 あたりに。
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 をバイナリ・エディット?
0900デフォルトの名無しさん
NGNG0901デフォルトの名無しさん
NGNGってやっちゃだめなの?
0902デフォルトの名無しさん
NGNG当然良し。
0903デフォルトの名無しさん
NGNGつーか便利だよ
vector<char>だと8倍メモリくうし
bool *p=&vec[0];
これができないとなんでだめなんだよー
0904デフォルトの名無しさん
NGNG0905デフォルトの名無しさん
NGNGvcでレベル4でコンパイルするとめちゃめちゃヲーニングでるけど
なんかあやしいきもするんですが・・・
0906デフォルトの名無しさん
NGNGVC6発見
#pragma warning (disable : 4786)
ソースの先頭に置いときなさい
0907デフォルトの名無しさん
NGNGはーい
0908デフォルトの名無しさん
NGNGちょいと遅レスだがたしかSTLは効率のために内部にちょびっと
つねにメモリもってるらしいよ。どっかの過去ログにあるはず。
で、どっかで何かをdefineすればなくなるがパフォーマンス
悪くなる。(ってことなのかな?的外れだったらスマソ)
0909デフォルトの名無しさん
NGNGそういうのはメモリリークとは言わないけどね。
0910デフォルトの名無しさん
NGNGメモリプールといいます。そういうのは。
0911デフォルトの名無しさん
NGNGstlportのiostreamを使う利点はあるのですか?
static-linkだと容量でかくなるし
もしたいした違いがないならコンパイルせずに
標準のiostream使おうと思うので
教えてください
0912デフォルトの名無しさん
NGNG0913912
NGNG0914デフォルトの名無しさん
NGNGglibc のバージョンが古いと思われ。
glibc-2.2(だったかな?)以降が入ってる環境を使うべし。
0915デフォルトの名無しさん
NGNGという変数宣言がされている状況で、
for_each(istream_iterator<string>(cin), istream_iterator<string>(),
coll.insert);
としたいんだけど、gcc-2.95.3 では
no matching function for call to `for_each (istream_iterator<string>, istream_iterator<string>, {unknown type})'
とエラーになってしまう…
(本当はもっとエラーメッセージが長いけど、適宜省略)
プロ言C++第3版の13.2.3を見ると「テンプレート引数としては…メンバに対す
る多重定義されていないポインタなどが使える」とあって、これからすると、
このset<string>::insertみたいな多重定義されているメンバ関数はテンプレート
引数としては渡せないような気もするんだけど、これって本当?
0916915
NGNGtemplate<class Collection>class Inserter {
private:
Collection *container;
public:
Inserter(Collection &c) { container = &c; }
void operator()(const typename Collection::value_type &v)
{
(*container).insert(v);
}
};
coll.insert の代わりに Inserter< set<string> >(coll) と書けば
できたけど、なんか納得いかないというか、イマイチGenericじゃない
気がしてる。実際、for_eachを手で展開して
istream_iterator<string> in(cin);
while (in != istream_iterator<string>())
coll.insert(*in++);
とすれば動くだけに、なんかクヤしい。
なんか良い手ないかしら?
0917デフォルトの名無しさん
NGNG0918デフォルトの名無しさん
NGNG#include <set>
#include <string>
#include <iterator>
#include <algorithm>
int main()
{
std::set<std::string> sset;
std::copy(
std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>(),
std::inserter(sset,sset.begin()));
std::copy(sset.begin(),sset.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
return 0;
}
0919デフォルトの名無しさん
NGNGstd::set<std::string> coll;
std::copy(std::istream_iterator<std::string>(std::cin), std::istream_iterator<std::string>(), std::insert_iterator<std::set<std::string> >(coll, coll.begin()));
std::setに関するstd::insert_iterator()の定義はちょっと面白いようになっている。
c.insert(p, t) を呼び出すわけだが、std::setではinsertのメンバ関数は探索位置を
指定する必要はない。だが互換性のためにヒントとしてパラメータを持っている。
そのためstd::insert_iterator()が使えるのである。
0920デフォルトの名無しさん
NGNG持たないからだ。
0921デフォルトの名無しさん
NGNGども。それは分かります。
ただ、915-916 で言いたかったのは、この処理は間違いなく
for_eachイディオムで書ける筈だし、実際マクロならFOR_EACH
の形で書けので、templateでだって可能じゃないのか、916で
やったように、insertをハードコードすることなく、(Scheme
なら lambda を使って簡単に書けるわけだから) C++ でもなにか
方法がある筈じゃないのかってことなんでした。
もっとも 915-916を書いた時点では、自分でも何が気に入ら
なかったのかはっきりしてなかったので、うまく書けませんでした。
0922915
NGNG3点大きな間違いがあって、まずそもそも「coll.insert」
っていうのは、C++ の文法上許されない表現なので、
template関数の引数には書けません。(^^;
正しい表現は &set<string>:insert となりますが、
この場合、&set<string>:insert だけでなく coll も
別に渡してやる必要がありました。
それから、この場合、coll.insert を渡している場所は
テンプレート引数ではなく、テンプレート関数の通常の
引数なので、くだんのプロ言C++第3版の13.2.3の記述は
そもそも関係ありませんでした。
最後に、ちゃんと確認してみたところ、使っている処理系
(gcc-2.95.3)だと、多重定義されているメンバ関数を
テンプレート引数として渡すことだって可能でした。
(gccの拡張機能?)
0923デフォルトの名無しさん
NGNGmem_fun_refに習って、次のような関数オブジェクトを定義しました。
template<typename ReturnType, typename Class, typename Arg1Type>
class obj_mem_fun1_t : public unary_function<Arg1Type, ReturnType> {
private:
Class *object;
ReturnType (Class::*memfun)(Arg1Type);
public:
explicit obj_mem_fun1_t(Class &o, ReturnType (Class::*mf)(Arg1Type))
: object(&o), memfun(mf) {}
void operator()(Arg1Type a1)
{
((*object).*memfun)(a1);
}
};
template <typename ReturnType, typename Class, typename Arg1Type>
inline obj_mem_fun1_t<ReturnType, Class, Arg1Type>
obj_mem_fun(Class &object, ReturnType (Class::*mf)(Arg1Type))
{
return obj_mem_fun1_t<ReturnType, Class, Arg1Type>(object, mf);
}
0924915
NGNGfor_each(
istream_iterator<string>(cin),
istream_iterator<string>(),
obj_mem_fun(coll, &set<string>::insert));
とすればOKかなと思ったんですが、gcc-2.95.35だと
no matching function for call to `obj_mem_fun (set<string> &, {unknown type})'
となってしまいました…
0925915
NGNGfor_each(
istream_iterator<string>(cin),
istream_iterator<string>(),
obj_mem_fun<
pair<set<string>::const_iterator, bool>,
set<string>,
const set<string>::value_type &
>(coll, &set<string>::insert));
とすればコンパイルもでき、動作しました。
これで、915-916で思ってたことは、ほぼ満足です。
(テンプレート引数を明示しなければいけないのが
ちょっと残念だけど。)
0926915
NGNG仕様なんでしょうか、バグなんでしょうか、それとも
未定義な部分(実装上の制限)なんでしょうか?
それから、こういう、オブジェクトに対する呼びだし
obj.message(arg1) を普通の関数呼びだし func(arg1)
の形式に変換する関数アダプタって、標準的にあって
も良さそうな気がするんですが、boost とか、そういう
準標準ライブラリとして、こういうものってないんで
しょうか?
0927915
NGNGう、書き間違えました。これは
> で、またまた疑問なんですが、924のコンパイルエラーは
でした。
0928デフォルトの名無しさん
NGNG0929デフォルトの名無しさん
NGNGinline obj_mem_fun1_t<ReturnType, Class, Arg1Type>
obj_mem_fun(Class2 &object, ReturnType (Class::*mf)(Arg1Type))
{
return obj_mem_fun1_t<ReturnType, Class, Arg1Type>(object, mf);
}
こうしたらVC7でとおった
0930デフォルトの名無しさん
NGNG何がやりたいのかよくわからん
レス数が900を超えています。1000を超えると表示できなくなるよ。