6

それが正しければ、これを使用して固定範囲を反復処理できます。

for(int i: {1, 2, 3, 4, 5})
    do_sth(i);

そして、これは同じことです:

vector<int> v{1, 2, 3, 4, 5};
for(int i: v)
    do_sth(i);

しかし、1、...、100 の範囲で反復処理を行い、コンパイル時にそれが既にわかっている場合はどうすればよいでしょうか? それを行う最も美しい方法は何ですか?最も効率的なものは何ですか?最短は?

編集: もちろん、通常の for ループを作成することもできますが、実際の使用例には s よりも複雑なコンテンツが含まれますint

例を少し単純化しすぎただけです。

4

6 に答える 6

16
for( int i = 1; i <= 100; ++i )
{
    do_sth( i );
}

?

于 2013-09-18T12:37:56.170 に答える
4

整数範囲を表す for-range 互換クラスを「簡単に」作成できます。そのためのイテレータを書くだけです。

または、まさにそれであるBoost.Range'scounting_rangeを使用できます。

于 2013-09-18T12:42:36.347 に答える
4

本当にコンテナに入れたい場合は、std::iota関数を使用してコンテナを埋めることができます。それ以外の場合は、通常のforループを使用してください。

于 2013-09-18T12:38:23.663 に答える
1

関数テンプレートで range-for を使用します。

namespace detail
{
    template <int... Is>
    struct index { };

    template <int N, int... Is>
    struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };

    template <int... Is>
    struct gen_seq<0, Is...> : index<Is...> { };
}

template <int... Is>
std::array<int, sizeof...(Is)> range(detail::index<Is...>)
{
    return {{ Is... }};
}

template <int N>
std::array<int, N> range()
{
    return range(detail::gen_seq<N>{});
}

例:

for (auto i : range<5>())
{
    do_sth(i);
}
于 2013-09-18T12:45:39.823 に答える
0
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> operator"" _r(const char* text, const size_t)
{
    string txt(text);

    auto delim  = txt.find('-');
    auto first  = txt.substr( 0, delim);
    auto second = txt.substr(delim + 1);

    int lower = stoi(first);
    int upper = stoi(second);

    vector<int> rval(upper - lower);

    generate(rval.begin(), rval.end(), [&]{ return lower++; } );

    return rval;
}

int main() 
{
    for(auto& el : "10-100"_r)
        cout<<el<<"\n";
}

実行時のオーバーヘッドが大きく、エラーが発生しやすい (主に私の実装) ... 好きなように!

しかし、それは問題を解決し、それほど醜くない構文さえ持っています:)

于 2013-09-18T13:31:21.433 に答える