汎用アルゴリズム:Tips(4)---再論初期化
常にいくつかの場合、「生成式」の初期化方法を使用してコンテナに値を割り当てることはできません.例えば、配列があり、それを初期値としてコンテナに割り当てるには、従来のやり方が浸透しています.
int init[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
std::vector vect(init, init + sizeof(init)/sizeof(int));
2つのsizeofによって配列の大きさを得ることはC言語ではよく見られるが,C++では醜くなくても決して良いとは言えない.まず可読性が悪く、次に1回の除算をしてコンパイル中に知っていた数字を得る必要があります.最後に、いつも使えるわけではありません.たとえば、次の例を示します.
std::string strs[] = { "Amy", "Ralph", "Simon", "Maggie"};
今、あなたは「sizeof」で何を除いて「sizeof」で何をするつもりですか?
実際、こんなに多くのC++GPの試練を経て、コンパイル中に静的配列の大きさを得る方法を簡単に考えることができます.テンプレートの偏特化は私たちがよく使う武器で、ここではとても使いやすいです.
template
struct ArraySize
{
static const unsigned int value = 0;
};
template
struct ArraySize
{
static const unsigned int value = S;
};
簡単だ!1次元配列にのみ対応しますが、拡張は簡単です.ただし、テンプレートパラメータはタイプのみで、入力する変数が必要です.幸いなことに、コンピュータ科学では、抽象化を加えるとどんな問題も解決できます.テンプレート関数を追加するだけで、C++は自動的にタイプの導出をしてくれます.
template
unsigned int array_size(const T&)
{
return ArraySize::value;
}
配列を簡単に解決できます
int ints[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
std::vector vint(ints, ints + array_size(ints));
std::string strs[] = { "Amy", "Ralph", "Simon", "Maggie"};
std::vector vstr(strs, strs + array_size(strs));
std::for_each(vint.begin(), vint.end(), std::cout << _1 << "");
std::cout << std::endl;
std::for_each(vstr.begin(), vstr.end(), std::cout << _1 << "");
出力:
2 3 5 7 11 13 17 19 23
Amy Ralph Simon Maggie
ちなみにboost.type_traitsの中にはArraySizeのようなツールがあります.extentと呼ばれています.それはもっと強くて、多次元配列に対処することができますが、boost.type_traitsは工事に含めて読者が自分で選んだのを見た.
=================================================================================
コンテナの初期化はこのように一般的であり、boostはこれらの操作を簡略化するためにassignライブラリを提供する.boost.assignは、リロードされたカンマとカッコを大量に利用して、付与操作を簡略化し、配列よりも簡潔な構文を提供します.
#include#include #include #include #include #include using namespace boost::assign;int main(){ std::vector vint; vint += 2,3,5,7,11,13,17,19,23; std::vector vstr; vstr += "Amy","Ralph","Simon","Maggie"; std::list lstr; lstr += "Amy","Ralph","Simon","Maggie"; std::for_each(vint.begin(), vint.end(), std::cout << _1 << ""); std::cout << std::endl; std::for_each(vstr.begin(), vstr.end(), std::cout << _1 << ""); std::cout << std::endl; std::for_each(lstr.begin(), lstr.end(), std::cout << _1 << "");}
このプログラムを実行すると、出力は前のものとほぼ同じですが、初期化がより簡潔になり、配列を格納する余分なスペースも必要なく、さまざまなタイプに対して統一的に初期化できることに気づきました.興味深いことにassignの著者は、Bjarne Stroustrupの言葉を引用した.There appear to be few practical uses of#include #include
int init[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
std::vector
2つのsizeofによって配列の大きさを得ることはC言語ではよく見られるが,C++では醜くなくても決して良いとは言えない.まず可読性が悪く、次に1回の除算をしてコンパイル中に知っていた数字を得る必要があります.最後に、いつも使えるわけではありません.たとえば、次の例を示します.
std::string strs[] = { "Amy", "Ralph", "Simon", "Maggie"};
今、あなたは「sizeof」で何を除いて「sizeof」で何をするつもりですか?
実際、こんなに多くのC++GPの試練を経て、コンパイル中に静的配列の大きさを得る方法を簡単に考えることができます.テンプレートの偏特化は私たちがよく使う武器で、ここではとても使いやすいです.
template
struct ArraySize
{
static const unsigned int value = 0;
};
template
struct ArraySize
{
static const unsigned int value = S;
};
簡単だ!1次元配列にのみ対応しますが、拡張は簡単です.ただし、テンプレートパラメータはタイプのみで、入力する変数が必要です.幸いなことに、コンピュータ科学では、抽象化を加えるとどんな問題も解決できます.テンプレート関数を追加するだけで、C++は自動的にタイプの導出をしてくれます.
template
unsigned int array_size(const T&)
{
return ArraySize
}
配列を簡単に解決できます
int ints[] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
std::vector
std::string strs[] = { "Amy", "Ralph", "Simon", "Maggie"};
std::vector
std::for_each(vint.begin(), vint.end(), std::cout << _1 << "");
std::cout << std::endl;
std::for_each(vstr.begin(), vstr.end(), std::cout << _1 << "");
出力:
2 3 5 7 11 13 17 19 23
Amy Ralph Simon Maggie
ちなみにboost.type_traitsの中にはArraySizeのようなツールがあります.extentと呼ばれています.それはもっと強くて、多次元配列に対処することができますが、boost.type_traitsは工事に含めて読者が自分で選んだのを見た.
=================================================================================
コンテナの初期化はこのように一般的であり、boostはこれらの操作を簡略化するためにassignライブラリを提供する.boost.assignは、リロードされたカンマとカッコを大量に利用して、付与操作を簡略化し、配列よりも簡潔な構文を提供します.
#include
このプログラムを実行すると、出力は前のものとほぼ同じですが、初期化がより簡潔になり、配列を格納する余分なスペースも必要なく、さまざまなタイプに対して統一的に初期化できることに気づきました.興味深いことにassignの著者は、Bjarne Stroustrupの言葉を引用した.There appear to be few practical uses of
operator,()
. Bjarne Stroustrup、The Design and Evolution of C++これがC++の最大の魅力の一つかもしれません.何ができるか予想できません.次にmapの例についてもboost.を用いる.assign、重荷の括弧がどれだけ便利かを見ることができます.include