2012-04-17 8 views
2

私は、ベクターを使用することが私がしなければならないことを達成する最良の方法であることを発見しましたが、今私はいくつかの明確化が必要です。mainで使用する関数から多次元ベクトルを返します。正しく使用するには?

外部CPPの関数内で多次元配列を生成し、main内で利用できるようにする必要があります。

main.cppに

// include vector, using namespace etc. 
function(2, 4); 

// how to access vector elements here - vectorname[2][4]->classvar; ? 

vectors.cpp

void function(value1, value2){ 
// class def 
int value1 = value1; 
int value2 = value2; 
vector<int>(value1)<vector<Class>(value2) vectorname>; // incorrect syntax? or new * vector ? 

return vectorname; // ? 
} 

答えて

2

vectorの構文には少し慣れている必要があります。あなたが特定の寸法を設定したい場合は、

vector<vector<int> > myVector; 

サイズを取る使用コンストラクタを:intの2次元ベクトルは次のようになります

vector<vector<int> > myVector(10, vector<int>(5)); 

これがゼロの10x5ベクトルを生成します。あなたの要素(この場合は-1)の初期値を提供するために、この

vector<vector<int> > myVector(10, vector<int>(5, -1)); 

を行うことができます。

大まかには、ベクトルを参照渡しして値で返すようにします。

+0

ありがとうございます。私はベクトルが関数内で作成されるまでベクトルのサイズがわからないので、デフォルト値を持たないmainでこれを定義し、それを参照渡しする必要がありますか? –

+0

@JackFarrowあなたは確かにそれを行うことができます。また、 'main'で初期化することもできず、値で返すこともできません:'ベクトル> myVect = function(4、6); ' – dasblinkenlight

+0

ありがとう。上記のコードで何が起きているのか説明できますか?私はこれがベクトル(intのような、myVectと呼ばれる)を定義していると仮定し、それを関数内で作成されたベクトル値にアサインしますか?この最高のパフォーマンスは賢明ですか? –

1

あなたのクラスの多次元ベクトルをしたい場合、それは次のようになります。

vector<vector<Class> > vectorname; 
return vectorname; 

署名の関数は次のようになります。

と、次の

vector<vector<Class> > function(value1, value2) 

int value1 = value1; 
int value2 = value2; 

は無意味です。

+0

返信いただきありがとうございます。だから、署名はどこに行く必要がありますか?メインの内部では、関数内のベクトルにどのように値を割り当てるのですか?普通のやり方で?ありがとう。 –

+0

@JackFarrow署名は、関数を宣言していても定義内にも置かれます。 'push_back'を使ってベクトルの内容を変更するか、メモリをあらかじめ割り当てて' [] [] 'を使うことができます。 –

0

あなたはこのようにそれを行うことができます。

1 #include <iostream> 
    2 #include <vector> 
    3 using namespace std; 
    4 
    5 class Test { 
    6 public: 
    7  Test() 
    8  { 
    9   cout << "Test()" << endl; 
10  } 
11  ~Test() 
12  { 
13   cout << "~Test()" << endl; 
14  } 
15 }; 
16 typedef Test classvar_t; 
17 typedef vector<classvar_t> d2_t; 
18 typedef vector<d2_t > md_vector_t; 
19 md_vector_t foo(int value1, int value2) 
20 { 
21  return md_vector_t(value1, d2_t(value2)); 
22 } 
23 
24 int main() 
25 { 
26  md_vector_t v = foo(3, 4); 
27  cout << "--------" << endl; 
28  return 0; 
29 } 
+0

メモリリークの原因となるのはなぜですか? –

+0

はい、あなたがそれを生成し、それを削除しなかった場合、過去のものはメモリリークを引き起こします。 – user1337700

1

あなたはこのような多次元ベクトルを宣言することができます。

std::vector< std::vector<int> > v; 

あなたも従って、コードを容易にするためのtypedefを使用することができます。

typedef std::vector<int> int_vector; 
typedef std::vector<int_vector> int_matrix; 

最初の例のように書くときは、閉じ角の括弧を1つ書いてはいけませんコンパイラが>>オペレータと混乱するのを避けるために、もう1つ。

この操作にベクトル全体をコピーする必要があるため、このようなオブジェクトを関数から戻すことも避けてください。その代わりに、例えば、参照によってベクトルを渡すことができます。

void process(int_matrix& m) 
{ 
    // m.push_back(...) 
} 

int main(int argc, char* argv[]) 
{ 
    int_matrix m; 

    // Initialize m here. 
    // ... 

    // Call your methods. 
    process(m); 

    // ... 

    return 0; 
} 

EDIT:

あなたはこのようなあなたのコードを構築することができます

// int_matrix.hpp 

#ifndef _INT_MATRIX_HPP 
#define _INT_MATRIX_HPP 

#include <vector> 

typedef std::vector<int> int_vector; 
typedef std::vector<int_vector> int_matrix; 

extern void process(int_matrix& m); 

#endif // ~_INT_MATRIX_HPP 

// int_matrix.cpp 

#include "int_matrix.hpp" 

void process(int_matrix& m) 
{ 
    m.clear(); 
    // ... 
} 

// main.cpp 

#include "int_matrix.hpp" 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    int_matrix m1; 
    int_matrix m2; 

    // ... 

    process(m1); 
    process(m2); 

    // ... 

    return 0; 
} 
+0

ありがとうございます。私は次の質問は、関数がメインの外部になるので、正しくこのベクトルを宣言する方法ですと思いますか?これもできますか? –

+0

あなたがこれを行う方法の例については、私の答えに編集を参照してください。 – npclaudiu

関連する問題