Java プログラマーとして、多次元配列を返す関数を取得するのに苦労しています。これを C++ でどのようにコーディングしますか?:
int[][] theFunction(){
int[][] var = new int[3][3];
// code
return var;
}
Java プログラマーとして、多次元配列を返す関数を取得するのに苦労しています。これを C++ でどのようにコーディングしますか?:
int[][] theFunction(){
int[][] var = new int[3][3];
// code
return var;
}
C++ では、これを行う最も簡単な方法は次のようになります。
std::vector<std::vector<int> > theFunction() {
std::vector<std::vector<int> > var(3, std::vector<int>(3));
// code
return var;
}
<vector>
これをコンパイルするには、含める必要があります。Java 汎用コンテナーとは異なり、C++ テンプレート コンテナーは、プリミティブをオブジェクトにラップするコストが発生しないため、パフォーマンスとメモリ消費の点で非常に効率的でありながら、柔軟性が大幅に向上します。
一般に、Cから「継承」された柔軟性の低い組み込みの代替手段よりも、 C++ スタイルのコンテナー (、、、および C++11 では、) を優先する必要がstd::vector
ありますstd::set
。std::map
std::array
要するに、C (たとえば、C++ から使用している方言 [C++ は C のスーパーセットであり、いくつかの変更が加えられています]) では、関数からベクトルや行列を返すことはできません。ただし、ポインターを返すことはできます (おそらく、それはあまり役に立ちません)。
C および C++ では、ベクトルの名前 (単純化してみましょう) は最初の位置へのポインターであるため、次のようになります。
int v[] = { 1, 2, 3 };
int * ptr = v;
ポインタはメモリ アドレスです。これを使用して、すべての要素を実行できます (ただし、危険な場合があります)。
for( ; ptr < ( v + 3 ); ++ptr) {
std::cout << *ptr << stD::endl;
}
そして、そのポインターを返すことができます:
int * vectorCreator(int max)
{
int * v = new int[max];
return v;
}
この場合、ベクトルの解放は呼び出し元が行うことに注意してください。これは解決できる問題ですauto_ptr
(これは新しい標準では廃止されてunique_ptr
います。コンパイラで許可されたら使用する必要があります)。
auto_ptr<int> vectorCreator(int max)
{
int * v = new int[max];
return auto_ptr<int>( v );
}
この方向性は C++ 標準ライブラリの一部であり、vector<>
テンプレートを使用できます。これはより安全で、間違いなくより快適です。
お役に立てれば。
他の人が言ったように、 を返すことができますstd::vector<std::vector<int> >
。これは、C++ の戻り値の最適化が非常に重要になる場合があることを指摘しておく価値があります。特に、このコードを見るだけで、関数が戻るときにベクトルのベクトル全体をコピーする必要があると思うかもしれません (C++関数の戻り値は値で返されます)。しかし、C++ で明示的に許可され、ほとんどすべてのコンパイラで実装されているこの最適化により、関数は、返される構造体にベクトルを割り当てることができます。
std::vector<std::vector<int> > theFunction() {
std::vector<std::vector<int> > var;
// code
return var;
}
C++ では C 配列 (表記上は Java 配列のように見える) を使用せず、以下を使用しますvector
。
typedef std::vector<std::vector<int> > VecType;
VecType theFunction()
{
VecType var(3, std::vector<int>(3));
// code
return var;
}