【C++】STL(Standard Template Library)相談室 11
自分の場合こんな関数作ってユーティリティに突っ込んである
template<typename T, typename Range>
inline void range_extend(T &t, const Range &r)
{
t.insert(t.end(), boost::begin(r), boost::end(r));
}
// c = a; range_extend(c, b);
>>108 vectorのイテレータがポインタではないライブラリではコンパイルエラーだぞ
c.begin() は &c[0] に置き換えないとダメ
というか
>>108 は memcpy にイテレータを直接渡してるじゃねーか
こんなん論外だ
!#include <iostream>
#include <vector>
#include <pstade/oven/jointed.hpp>
#include <pstade/oven/sugar.hpp>
#include <pstade/oven/copied.hpp>
#include <pstade/oven/io.hpp>
#include <pstade/oven/identities.hpp>
#include <pstade/oven/initial_values.hpp>
int main(int, char *[])
{
namespace ov = pstade::oven;
using namespace pstade::oven::sugar;
std::vector<int> a = ov::initial_values(1, 2, 3), b = ov::initial_values(4, 5, 6);
std::vector<int> v = (a >> b)|ov::copied;
std::cout << (v|ov::identities);
}
sugarで(問題部分だけは)さらに短くかけるらしいです
>よからぬ場所に出入りしていると、当てにならない人物に出くわし、 &v[ 0 ] の代わりに
>v.begin() を使うことができると言われるかもしれない。
(中略)
>率直に言えば、 &v[ 0 ] の代わりに v.begin() を使うよう勧めるような人たちと付き合っているなら、
>交友関係を考え直す必要がある。
スコット・メイヤーズ著 ピアソンエデュケーション刊
Effective STL〜STLを効果的に使いこなす50の鉄則 p.73
そもそも >105 の質問は「一番シンプル」な方法を求めているんだから >106 が正解。
再確保によるロスを防ぎたかったら c.reserve(a.size() + b.size()) で準備してから
実行すればいい。 >108 の resize() では無駄な初期化( int の場合は 0 フィル)が入る。
要素型に依存する必要はまったく無い。
int の場合に memcpy() に最適化するというのも、ライブラリの実装やコンパイラが判別できる
範囲の話。