1

配列を分割しようとしていますが、これが私がやっている方法です:

int arr1[] = {1, 2, 3, 4, 5};
int *arr2 = arr1 + 1;

これをループで行う必要があります。すべての反復で、条件に基づいて配列のサイズを 1 要素または 2 要素減らしようとしています。明らかな理由で、私は宣言できませんint arr2[some_variable]

しかし、ループの反復ごとに、サイズが親配列よりも 1 小さい新しい配列を作成したいと考えています。どうすればこれを達成できるかわかりません。誰でも助けてもらえますか?

Java には、これを実行できる関数がありますint newArr[] = Arrays.copyOfRange(arr, 1, arr.length);。C++ でこれに似たものが欲しかったのです。

4

3 に答える 3

5

std::vector<int>C++ 標準ライブラリから使用します。

#include <string>
#include <iostream>
#include <vector>

void dump(std::vector<int> &v)
{
    for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
        std::cout << *it << " ";
}

int main()
{
    int a[] = { 1, 2, 3, 4, 5 };
    std::vector<int> v(a, a + 5);
    std::vector<int> v2(v.begin() + 1, v.begin() + 4);

    dump(v);
    std::cout << std::endl;
    dump(v2);
}

そして、あなたが本当に本当に本当に使えないならvector(なぜ、真剣に?)、ただmemcpy.

int arr[] = { 1, 2, 3, 4, 5 };
int cp[3];
memcpy(cp, arr + 1, sizeof(cp));
于 2013-06-26T20:27:56.570 に答える
2

毎回新しいものを持ちたい理由は正確にはわかりませんが、次のような標準のコンテナーを使用できますstd::vector

std::vector<int> arr1{1, 2, 3, 4, 5}; //std::iota is another option
int index{};
/*loop header*/ {
    //make sure arr1.size() is at least 1
    std::vector<int> arr2(std::next(std::begin(arr1), ++index), std::end(arr1));
}

std::nextより多くのシナリオで機能するため、使用します。これが行うのは、2 つの反復子からベクトルを作成することだけです。必要に応じて先頭を過ぎて、最後 (排他的であるため 1 つ過ぎます) です。

C++11 は優れていますが、常に現実的であるとは限りません。その場合、これはうまくいくはずです:

int arr1temp[] = {1, 2, 3, 4, 5};
std::vector<int> arr1(arr1temp, arr1temp + sizeof(arr1temp)/sizeof(arr1temp[0]));

int index = 0;
/*loop header*/ {
    //make sure arr1.size() is at least 1
    std::vector<int>::iterator start = arr1.begin();
    std::advance(start, ++index); 
    std::vector<int> arr2(start, arr1.end());
}
于 2013-06-26T20:29:38.140 に答える