【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 あたりに。
0524デフォルトの名無しさん
NGNG0525デフォルトの名無しさん
NGNGstruct CompByTuple1st
{
bool operator()(const Tuple& t1, const Tuple& t2)
{
return t1.get_head() < t2.get_head();
}
};
を比較用の関数オブジェクトとして sort に渡す、かねぇ。汎用性ゼロ
だが。
0526デフォルトの名無しさん
NGNGそれであってる (gccなら通る) 。…が、その場合 mem_fn はなくてもOK。
BCBでまともに boost::bind を動かすのはあきらめた方が無難ではないかと。
0527デフォルトの名無しさん
NGNGとりあえず、比較オブジェクトをtemplateにして
template <typename T, int I>
struct CompareByNth
{
bool operator()(const T & a, const T & b) const
{
return a.get<I>() < b.get<I>();
}
};
で逃げることにしました。これにstd::lessを簡単に渡せればいいんですけど…
0528デフォルトの名無しさん
NGNGgccで通った?俺はg++3.2.1で試してみたが、
C:/MinGW/Learn/boost/tuple.cpp:18: no matching function for call to `mem_fn(
<unknown type>, boost::arg<1>&)'
C:/MinGW/Learn/boost/tuple.cpp:19: no matching function for call to `mem_fn(
<unknown type>, boost::arg<2>&)'
C:/MinGW/Learn/boost/tuple.cpp:21: parse error before `;' token
なんてエラーが出やがる。
0529デフォルトの名無しさん
NGNG0530デフォルトの名無しさん
NGNGboost::mem_fnを取ったらg++で通ったよ。
0531526
NGNGあーほんとだ。523のをコピペじゃなくて書き写したんで、微妙に
違うコードをコンパイルしてたわ。
sort( data.begin(), data.end(),
bind( less<int>(),
bind( mem_fn(&Tuple::get<0>), _1),
bind( mem_fn(&Tuple::get<0>), _2) ));
//mem_fnは無くてOK。
0532デフォルトの名無しさん
NGNGスマートに書けないものでしょうか?
struct A {
virtual int func() {
return 1;
}
};
struct B : public A {
int func() {
return 2;
}
};
int AddA(int i, A* a)
{
return i + a->func();
}
0533デフォルトの名無しさん
NGNG{
std::vector<A*> a;
const int maxi = 100000;
for (int i = 0; i < maxi; i++)
if (std::rand() % 2)
a.push_back(new A);
else
a.push_back(new B);
int i;
std::accumulate(a.begin(), a.end(), 0, AddA);
std::cout << i << std::endl;
}
0534デフォルトの名無しさん
NGNGback_inserter と generator 使うと、もっとうまく書けそうな予感。
0535デフォルトの名無しさん
NGNGstruct Add {
int value;
Add(int i) : value(i) {}
void operator()(A* a) {
value += a->func();
}
};
int main()
{
std::vector<A*> a;
const int maxi = 100000;
for (int i = 0; i < maxi; i++)
if (std::rand() % 2)
a.push_back(new A);
else
a.push_back(new B);
int i;
i = std::for_each(a.begin(), a.end(), Add(0)).value;
std::cout << i << std::endl;
}
0536デフォルトの名無しさん
NGNGback_inserterを使うという事は、他のvectorに値を入れるという事でしょうか?
0537デフォルトの名無しさん
NGNGint main()
{
std::vector<A*> a;
std::vector<int> b;
const int maxi = 100000;
for (int i = 0; i < maxi; i++)
if (std::rand() % 2)
a.push_back(new A);
else
a.push_back(new B);
std::transform(a.begin(), a.end(), std::back_inserter(b), std::mem_fun(&A::func));
int i;
i = std::accumulate(b.begin(), b.end(), 0);
std::cout << i << std::endl;
}
0538デフォルトの名無しさん
NGNGinline A* gen()
{
return (std::rand() % 2) ? new A : new B;
}
int main()
{
std::vector<A*> a;
std::vector<int> b;
const int maxi = 100000;
std:generate_n(std::back_inserter(a), maxi, gen);
std::transform(a.begin(), a.end(), std::back_inserter(b), std::mem_fun(&A::func));
int i;
i = std::accumulate(b.begin(), b.end(), 0);
std::cout << i << std::endl;
}
0539デフォルトの名無しさん
NGNG#include <boost/iterator_adaptors.hpp>
int accumulate( const std::vector< A* >& v )
{
    std::mem_fun_t< int , A > func( &A::func );
    return std::accumulate(   boost::make_transform_iterator( v.begin() , func )
                            , boost::make_transform_iterator( v.end() , func )
                            , 0 );
}
0540デフォルトの名無しさん
NGNGすぐにInternal compiler errorを吐きやがります。
VC6は食います。
そんなもんですかね。
0541デフォルトの名無しさん
NGNGすげー!こんなコードが書けるのか。
やっぱりSTLやboostは奥が深いですねえ。
0542デフォルトの名無しさん
NGNGVCも使ってるって事は、gccはcygwinかMinGW?
0543デフォルトの名無しさん
NGNGYES YES YES
gcc3,VC7ではもちろんとおります
0544デフォルトの名無しさん
NGNGgcc2.95.2にこだわる理由は何?
もしかして仕事で使っているとか?
0545デフォルトの名無しさん
NGNGstd::vector<A*> a を generate_n で作るまでは OK として、その後は
std::accumulate(v.begin(), v.end(), 0,
boost::compose_f_gx_hy(
std::plus<int>(),
std::identity<int>(),
std::mem_fun(&A::func)
));
ってな感じでどう?
0546545
NGNGうまいな。そっちの方が見やすいかもしれん。
>>540
template 使いたいなら gcc 3 系列に移行しましょう。
…俺も仕事でいまだに gcc 2.96 使ってるけど、早く捨てたい。
0547543
NGNG仕事なんでVC6/GCC2.95を使わざるをえません。
あれからいろいろいじったけど、
どうやってもgcc2.95で通らないんだな。
vc6は、使うものしか処理しないって感じだねえ。
gcc2.95は、使おうが使うまいが、ある程度処理するみたい。
落ちてるところは実際には使われない部分だったりするからナントモ。
0548デフォルトの名無しさん
NGNGstd::identityってのは初めて見ました。ここの文脈ではint()とは書けないから
必要なんですね。標準C++には無いようですが、STLportには幸いにも装備
されていました。
0549デフォルトの名無しさん
NGNGこれの代用になる物がありますか?
0550デフォルトの名無しさん
NGNG簡単なものだから、自分で書いちゃっても。
これは要するに
f(x) = x
となるような恒等変換をする関数オブジェクト。
namespace std {
template <typename T>
struct identity : public unary_function<T, T>
{
T& operator()(T& x) const { return x; }
const T& operator()(const T& x) const { return x; }
};
}
0551デフォルトの名無しさん
NGNGなるほど、関数オブジェクト化すればよかったのですね。
ありがとうございます。
0552デフォルトの名無しさん
NGNGstruct A{
template<class T> struct B{};
};
template<class T1,class T2>
struct C{
typedef A<sizeof(T1)==sizeof(T2)>::B<T1> type;
};
main(){
A<sizeof(int)==sizeof(int)>::B<int> val1; // ここはエラーにならない
C<int,int>::type val2; // ここでエラー
}
これって文法的にはどうなんでしょうか?
VC7とDigital Mars C++では通るのですが、
去年の夏ごろのmingwではコンパイラ内部エラーになり、
冬に出たmingwでは内部エラーにはならないもののコンパイルできないのです。
0553デフォルトの名無しさん
NGNG0554543
NGNG-----
// gcc2.95(cygwin)でinternal compiler error
template<typename T>
struct A {
T* pT;
};
//template<typename V>
struct B {
template<typename T>
struct C : public A<T> {
void func(T* pT) {
return;
}
};
};
-----
中央のコメントアウトしたのを外すと通し、使える。
ひょっとして外出?
0555デフォルトの名無しさん
NGNG手元の処理系で試してみたけど
× gcc version 2.95.4 20020320 [FreeBSD]
○ gcc version 2.96-ee-001003-1
○ gcc version 3.2 (mingw special 20020817-1)
ってことで gcc 2.96 で修正済みのバグと思われ。
0556デフォルトの名無しさん
NGNG検証サンクス。gcc2.95そのもののバグなのね。
とりあえずB<void>でworkaroundしときます。
これでようやくVC6と合わせられる・・・
0557デフォルトの名無しさん
NGNGmap<string,int> WD;
としている時に
mapのsecondの値(int)の大小を比較して大きい順にソートするよい方法って
ないですか?
最終的にはそのソートされたfirst(string)を順番に表示したいのですが。
0558デフォルトの名無しさん
NGNGfirstとsecondを逆にして他のmapに挿入し直す。
0559デフォルトの名無しさん
NGNGありがとうございます。
intをキー値に持つマップに格納してみます。
0560デフォルトの名無しさん
NGNGコンパイラはBorland-C++5.6.2です。
hash_map insert(10) = 107
map insert (10) = 114
hash_map lookup(10) = 48
map lookup (10) = 29
hash_map insert(100) = 486
map insert (100) = 708
hash_map lookup(100) = 289
map lookup (100) = 277
hash_map insert(1000) = 5395
map insert (1000) = 7743
hash_map lookup(1000) = 2593
map lookup (1000) = 3586
hash_map insert(10000) = 54202
map insert (10000) = 93014
hash_map lookup(10000) = 28221
map lookup (10000) = 54862
hash_map insert(100000) = 839600
map insert (100000) = 1476372
hash_map lookup(100000) = 335070
map lookup (100000) = 1084240
hash_map insert(500000) = 3934177
map insert (500000) = 9722710
hash_map lookup(500000) = 1835211
map lookup (500000) = 7610511
予想以上の差に驚いています。要素の数が増大すればする程差が開いて
行きますね。
0561デフォルトの名無しさん
NGNGまとめてvectorとかに入れたいんだけど、どうすればいいかな?
0562デフォルトの名無しさん
NGNG川o・-・)ノ <先生!こんなのがありました!
__/ / /
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
...|| ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/hiroyuki/
0563デフォルトの名無しさん
NGNG金融のバナーばっかり
0564557
NGNGfirstとsecondを入れ替えてみたのですがこれを出力すると
intの数値が同じものはstring部がすべて表示できませんでした。
このように数値が重複しているものでも別々に出力するにはどうすれば
いいのでしょうか?
0565デフォルトの名無しさん
NGNGmultimap
0566デフォルトの名無しさん
NGNGそのくらいは自分で分かるようになりなよ…。
そもそも連想配列が分かってないんじゃ?
0567デフォルトの名無しさん
NGNGint main()
{
std::map<std::string, int> si;
si["abc"] = 1;
si["def"] = 1;
si["ghi"] = 2;
std::multimap<int, std::string> is;
std::map<std::string, int>::iterator sii;
for (sii = si.begin(); sii != si.end(); ++sii)
is.insert(std::make_pair(sii->second, sii->first));
std::multimap<int, std::string>::iterator isi;
for (isi = is.begin(); isi != is.end(); ++isi)
std::cout << isi->first << ' ' << isi->second << std::endl;
}
0568デフォルトの名無しさん
NGNGちなみに1次元配列なら全然問題ないんスけど。教えてぷりーず。
#include <vector>
using namespace std;
int main()
{
vector<vector<int> > IntAry;
IntAry.assign(5);// 5 x 6 array
for(int i=0; i<IntAry.size(); i++) IntAry[i].assign(6);
}
0569デフォルトの名無しさん
NGNGコンパイルエラーを省くなとあれほど・・・・
0570デフォルトの名無しさん
NGNGvector.assign(int)というメンバ関数はないっス・・・・・・
0571デフォルトの名無しさん
NGNGこの場合はresize()では。
0572デフォルトの名無しさん
NGNGvector<vector<int> > IntAry(5, vector<int>(6, 0));
0573デフォルトの名無しさん
NGNG中に何か入るの?
0574デフォルトの名無しさん
NGNG受け取るための袋だろ?
0575デフォルトの名無しさん
NGNG0576デフォルトの名無しさん
NGNG関数のプロトタイプないし呼び出しにて、「引数が何も無い」 事を示している。
括弧をつけないと、関数のプロトタイプないし呼び出しではなく関数へのポインタを得る事になる。
0577山崎渉
NGNG0578デフォルトの名無しさん
NGNGスマソ。投稿後すぐに分かった。
>>572
何故分かるの?凄すぎ。出直し逝ってきます。
0579デフォルトの名無しさん
NGNGstd::vectorには、vector c(n, elem) というコンストラクタがある。
elemの要素をn個コピーして初期化する。
って書かなくてもわかるよね。
0580デフォルトの名無しさん
NGNG0581デフォルトの名無しさん
NGNG0582デフォルトの名無しさん
NGNG0583デフォルトの名無しさん
NGNG標準C++の次期規格が固まる時まで無理だと思ふ。
0584デフォルトの名無しさん
NGNGそうなったらstdのコンテナは使わないって意味?
0585デフォルトの名無しさん
NGNG>>582は完全にネタだろ。
0586デフォルトの名無しさん
NGNGLoki::RefCountedMTだけテンプレートパラメータの数が違う気がするんですが、
これでいいんですか?
gccだとコンパイル通りませんが。
int main(void){
Loki::SmartPtr<int, Loki::RefCountedMT> p;
return 0;
}
過去ログ一応見ましたが、がいしゅつだったらご免なさい。
0587デフォルトの名無しさん
NGNG(文法レベルで)ちょっとわからない事があったのですが、
コンストラクタの引数の
template<typename Y>
weak_ptr(weak_ptr<Y> const & r)
という書き方、これは一体何を表しているのでしょうか?
生のポインタなら Y* const はわかるのですが、それって対応するのは
weak_ptr<const Y> ですよね?
ポインタ自体が const なら const weak_ptr<Y> ですよね?
weak_ptr<Y> const& っていうのは何を表しているんでしょうか?
0588デフォルトの名無しさん
NGNGconst AAA &
と
AAA const &
は同じ意味。
0590デフォルトの名無しさん
NGNG↓こんな話があった。
http://pc3.2ch.net/test/read.cgi/tech/1002252975/594-626
0591587
NGNGVC++6.0 で boost::mem_fn を自作スマートポインタに適用しようとしたら
C:\Program Files\Microsoft Visual Studio\VC98\include\xmemory(34) : error C2660: 'new' : 関数が不正な 2 個の実引数をともなって呼び出されました。
C:\Program Files\Microsoft Visual Studio\VC98\include\xmemory(66) : コンパイルされたクラスのテンプレートのインスタンス化 'void __cdecl std::_Construct(MyPtr<PointeeType> *,const MyPtr<PointeeType> &)' の参照を確認してください
みたいなエラーになりました。何がいけないか以上の情報でわかる人いますか?
ちなみに同じ状況で自作スマートポインタを boost::shared_ptr に変えると
コンパイル通るのです。
>>590
激しく鬱ですね…。ポインタが全て Ptr<PointeeType> みたいな書式になって
配列を int[] num; みたいに書ければ const が全て直後の型に掛かる。で統一できるのに…。
0592デフォルトの名無しさん
NGNGboost::mem_fn 側ではnewもstd::allocatorも一つも使っていないようだが…。
そのエラーは他の場所が原因に見える。あと、mem_fn を使うには
namespace boost {
template<typename T> T* get_pointer( const T& p ) { return &*p; }
}
が必要だが、書いてる?
>>589
boost coding guildline。らしい。
http://groups.yahoo.com/group/boost/files/coding_guidelines.html#decl_initialization
0593デフォルトの名無しさん
NGNG0594デフォルトの名無しさん
NGNGで、プログラム内でのそのテンプレートの使い方が限られているなら
明示的インスタンス生成ですな。
0595デフォルトの名無しさん
NGNGそのガイドラインの評価ってどうなってんの?
0596デフォルトの名無しさん
NGNGそこでSTLのsetとmultisetを使おうと思って以下のように書いたんですが、
ソースのいたるところでif(cyofukuOK)の分岐だらけになってしまってます。
もっといい方法ないでしょうか?
set<AnsiString> setContainer
multiset<AnsiString> multiContainer
//以下略
if(cyofukuOK)
multiContainer.insert(tmp);
else
setContainer.insert(tmp);
0597デフォルトの名無しさん
NGNGmultisetを操作するラッパーを作ればいいんじゃねーの?
0598デフォルトの名無しさん
NGNGstd::set, std::multiset を直にコードに埋めずに、
1) std::set を保持し、それを操作するクラス。
2) std::multiset を保持し、それを操作するクラス。
と二つに分けてしまう。
Set* pSet;
if (cyofukuOK)
pMap = new MultiSet();
else
pMap = new UniqueSet();
struct Set {
virtual void insert(AnsiString) = 0;
...
};
class UniqueSet : public Set {
std::set<AnsiString> container_;
public:
void insert(AnsiString s) { container_.insert(s); }
};
class MultiSet : public Set {
std::set<AnsiString> container_;
public:
void insert(AnsiString s) { container_.insert(s); }
};
0599デフォルトの名無しさん
NGNG598さん、ありがとうございます。
早速やってみました。
コンテナに保持するまではうまくいったのですが、
iteratorはどうやって保持すればいいんでしょうか?
以下のようにすると特化パラメータを指定しろというエラーメッセージが出るのですが、よくわかりません。
forで使うのでbegin(),end()も必要なんでしょうかね?やはり・・
struct mySet {
virtual void insert(AnsiString) = 0;
virtual iterator getiterator(void) = 0;
};
class UniqueSet : public mySet {
std::set<AnsiString> container_;
std::set<AnsiString>::iterator itrator_;
public:
void insert(AnsiString s) { container_.insert(s); }
iterator getiterator(void) { return itrator_; }
};
class MultiSet : public mySet {
std::multiset<AnsiString> container_;
std::multiset<AnsiString>::iterator itrator_;
public:
void insert(AnsiString s) { container_.insert(s); }
iterator getiterator(void) { return itrator_; }
};
0600デフォルトの名無しさん
NGNGちなみに現状はこんな感じです。
typedef set<AnsiString> SetContainer;
typedef SetContainer::iterator SetIterator;
SetContainer Container
;
if (cyofukuOK)
{
for(SetIterator it=Container.begin();it!=Container.end();++it)
TRichEdit1->Lines->Add(*it);
{
else
{
以下略
}
0601591
NGNG>>592
か、書いてませんでした。下記のような感じのオーバーロードでいいのでしょうか?
namespace boost
{
template <typename T>
T* get_pointer(const MyNamespace::MyPtr<T>& smartPtr)
{
return &(*smartPtr);
}
}
ちなみにこれを書いてもエラーメッセージは何も変わりませんでした。
よろしくお願いします。
0602デフォルトの名無しさん
NGNG> 以下のようにすると特化パラメータを指定しろというエラーメッセージが出るのですが、
そりゃ
> iterator getiterator(void) { return itrator_; }
ここの戻り値の型である iterator ってのが、テンプレート型だからでしょ。クラス定義
の中に
typedef std::set<AnsiString>::iterator iterator;
とでも追加しとかんと。
0603デフォルトの名無しさん
NGNGvector<T> vec; が格納している要素列の先頭アドレスを得るのに
&vec[0] とやると思うんだけど、この操作は、vec.empty() == true
の時も有効でしょうか。
0604デフォルトの名無しさん
NGNG0605デフォルトの名無しさん
NGNG&vec[0] に「書き込む」のはダメだが、&vec[0] を取得するのは問題ないと思うぞ。
0606デフォルトの名無しさん
NGNGあなたひどいひとね。
0607デフォルトの名無しさん
NGNGその式の値をどう使うつもりだ?
0608605
NGNG0609デフォルトの名無しさん
NGNGイテレータ同士の比較とか、C 関数に渡す場合には使えるよね。
/* 要素数 num の int 配列を処理する */
extern "C" void foo(int *data, size_t num);
vector<int> v;
..
foo(&vec[0], vec.size());
0610デフォルトの名無しさん
NGNG解決しました。
思いっきり勘違いしてました。最終的に以下のようになりました。
ありがとうございました。
//.h
struct mySet {
virtual void insert(AnsiString&) = 0;
virtual unsigned int getSize(void) = 0;
typedef std::set<AnsiString>::iterator iterator;
virtual iterator begin(void) = 0;
virtual iterator end(void) = 0;
};
//.cpp
auto_ptr<mySet> pSet;
if(RepeatDataCheckBox->Checked)//重複なし
{
auto_ptr<UniqueSet> instance (new UniqueSet());
pSet = instance;
}
else //重複あり
{
auto_ptr<MultiSet> instance (new MultiSet());
pSet = instance;
}
pSet->insert(tmp);
typedef std::set<AnsiString>::iterator iterator;
for(iterator it = pSet->begin();it!=pSet->end();++it)
{
ed->Lines->Add(*it);
}
0611デフォルトの名無しさん
NGNGv.empty()のとき、v.begin()は"past-the-end"っていう値を返すことになってる(23.1 -7-)。
イテレーターiについて、*iが定義されるようなiの値を、"dereferencable"っていう
けど、"past-the-end"は"dereferencable"じゃぁない(24.1 -5-)。
ってことで、v.empty()のとき、v[0]は
"dereferencable"ではないイテレーターに operator * を適用することになるので、
未定義である。
あとから & つけたところで手遅れだと思われ。
0612605
NGNGコンテナ a の operator[](int n) は *(a.begin() + n) と定義されているから、n = 0 のときに
*a.begin() (== *a.end()) が許されるか否かが問題。
a.end() は常に past-the-end-value (有効な要素の『次』を指す) イテレータを返し、これ
は
> 24.1 Iterator requirements
> 6. (前略) Values of an iterator i for which the expression *i is defined are called
> dereferenceable. The library never assumes that past-the-end values are
> dereferenceable
ということでデリファレンスしてはいけない。つまり *a.begin() という表記は NG で、
従って &a[0] も NG ってことになる。
ただし、現実には参照はコンパイラ内部ではポインタとして実装されてるから
vector<int> v;
int& n = &v[0];
int* p = &n;
とした場合でも p (n のアドレス) だけ見てる分には問題ない。ただし *p = 1 とか
int x = *p といったように、n の値を読み書きすると、一般保護違反で落ちたりメモリ
壊したりする。
……ってことかね。
0613605
NGNG0614デフォルトの名無しさん
NGNGその場合、mySetのデストラクタにvirtualが要る。
MultiSetの実装が謎だ。なんでコンパイルとおるんだ?
絶対解決してないと思うんだが?
0615デフォルトの名無しさん
NGNGvector<T>::iterator が T* という良くある環境だと問題ないけど、STLport の
デバッグモードみたいに別の型が返ってくる(それをデリファレンスすると T
になる)だと、怒られそうな気がする。
とはいえ微妙に使いにくい仕様だな、これ。>>609 にあるような C 言語の関
数を呼ぶ場合、どうせ C 関数の方で要素数チェックして 0 なら何もしない、
ってのが普通だし、そっちにチェックを任せたいよな。
0616611
NGNG0617デフォルトの名無しさん
NGNGこのようにしましたけど、問題ないようです。
環境はBCB5でWindowsXPです。
//重複なしのコンテナ
class UniqueSet : public mySet {
std::set<AnsiString> container_;
std::set<AnsiString>::iterator itrator_;
public:
void insert(AnsiString& s) { container_.insert(s); }
unsigned int getSize(void){ return container_.size(); }
iterator begin(void){ return container_.begin(); }
iterator end(void){ return container_.end(); }
};
//重複ありのコンテナ
class MultiSet : public mySet {
std::multiset<AnsiString> container_;
std::multiset<AnsiString>::iterator itrator_;
public:
void insert(AnsiString& s) { container_.insert(s); }
unsigned int getSize(void){ return container_.size(); }
iterator begin(void){ return container_.begin(); }
iterator end(void){ return container_.end(); }
};
0618デフォルトの名無しさん
NGNGgccでも↑のコードがエラーにならん。
仕様じゃ、ないよな?
0619デフォルトの名無しさん
NGNGsize()==0よりもempty()を使えって話になるんじゃないか?
0620デフォルトの名無しさん
NGNGそれでも
extern "C" void foo(int *data, size_t num);
に対して、これを利用する C++ 側関数は
vector<int> v;
if (!v.empty())
foo(&v[0], v.size());
と場合分けが必要になるよね。
0621デフォルトの名無しさん
NGNG↓で問題ないと思う。
inline
void foo( vector<int>& v )
{
  if(!v.empty())
    foo(&v[0],v.size());
}
0622デフォルトの名無しさん
NGNG俺だったらこんな関数作って使うかな。
templat<class T>
inline T* GetFirstPointer( vector<T>& v )
{
if(v.empty())
return NULL;
else
return &v[0];
}
で、vectorが空でも&v[0]が許される実装で、
かつ効率が気になる場合は
単純に&v[0]を返すように書き換えると。
0623622
NGNG誤:templat<class T>
正:template<class T>
■ このスレッドは過去ログ倉庫に格納されています