12

私は現在脳のおならを持っています、そして私は配列を取りそしてそれの半分を関数に渡すための速い方法を探しています。10個の要素の配列Aがある場合、一部の言語では、A [5:]のようなものを関数に渡して、それで実行できます。C ++にも同様の構造がありますか?もちろん、ループ機能を避けたいと思います。

4

2 に答える 2

10

はい。プレーンCではポインターを使用しますが、C ++では任意の種類のイテレーターを使用できます(ポインターはイテレーターと見なすことができます)。

template<typename Iter>
void func(Iter arr, size_t len) { ... }

int main() {
    int arr[10];
    func(arr, 10);    // whole array
    func(arr, 5);     // first five elements
    func(arr + 5, 5); // last five elements

    std::vector<Thing> vec = ...;
    func(vec.begin(), vec.size());          // All elements
    func(vec.begin(), 5);                   // first five
    func(vec.begin() + 5, vec.size() - 5);  // all but first 5

    return 0;
}

典型的なトリックは、配列の最初の要素へのポインターを渡し、次に別の引数を使用して配列の長さを渡すことです。残念ながら、境界チェックはありません。そのため、正しく設定するように注意する必要があります。そうしないと、メモリに落書きが発生します。

ハーフオープンレンジを使用することもできます。これはそれを行うための最も一般的な方法です。(のような)標準ライブラリの多くの関数はstd::sortこのように機能します。

template<class Iter>
void func(Iter start, Iter end) { ... }

int main() {
    int arr[10];
    func(arr, arr + 10);       // whole array
    func(arr, arr + 5);        // first five elements
    func(arr + 5, arr + 10);   // last five elements

    std::vector<Thing> vec = ...;
    func(vec.begin(), vec.end());       // whole vector
    func(vec.begin(), vec.begin() + 5); // first five elements
    func(vec.begin() + 5, vec.end());   // all but the first five elements

    return 0;
}

繰り返しますが、境界チェックはありません。

于 2012-11-27T01:42:38.670 に答える
2

私も同じように使用しましたが、代わりにベクトルを使用して構文を使用しました

vector <int> a(10);
// for example to use by removing first element

a = std::vector<int>(a.begin() + 1, a.end())
//its ur turn to change the size
于 2020-04-08T19:04:46.603 に答える