ページ 11

Vector2次元配列の使い方

Posted: 2015年11月09日(月) 01:58
by あるちゃ
初めて質問させて頂くものです。読み辛い文章かもしれませんがよろしくお願い致します。
以下のコードを実行させ、予想では、
0123456789
0123456789
0123456789
と出力されるのではと思ったのですが、上手くいきませんでした。

やりたいこととしましては、
v[1],v[2],v[3]にそれぞれ複数の要素を入れ、v[1][6]でv[1]の6番目の要素を指定したいのですが、これでは無理なのでしょうか?

コード:

#include "stdafx.h"
#include "vector"
using namespace std;

vector<vector<int> > v(3, vector<int>(10));

int _tmain(int argc, _TCHAR* argv[])
{
	for (int x = 0; x < 3; ++x)
	{
		for (int y = 0; y < 10; y++){
			v[x].push_back(y);
			printf("%d\n", v[x]);
		}
	}
	return 0;
}

Re: Vector2次元配列の使い方

Posted: 2015年11月09日(月) 02:53
by かずま
あるちゃ さんが書きました: v[1],v[2],v[3]にそれぞれ複数の要素を入れ、
v[0], v[1], v[2] にですね。

コード:

#include <vector>
#include <cstdio>
using namespace std;
 
vector<vector<int> > v(3, vector<int>(10));
 
int main(int argc, char* argv[])
{
    for (int x = 0; x < 3; ++x) {
        for (int y = 0; y < 10; y++) {
            v[x].push_back(y);
        }
    }
    for (size_t x = 0; x < v.size(); x++) {
        for (size_t y = 0; y < v[x].size(); y++)
            printf(" %2d", v[x][y]);
        printf("\n");
    }
    return 0;
}
実行結果

コード:

  0  0  0  0  0  0  0  0  0  0  0  1  2  3  4  5  6  7  8  9
  0  0  0  0  0  0  0  0  0  0  0  1  2  3  4  5  6  7  8  9
  0  0  0  0  0  0  0  0  0  0  0  1  2  3  4  5  6  7  8  9
v は宣言時に 3行 x 10列 の領域が確保されているので、
各行に push_back() で要素を追加したら、3 x 20 になるのは当然です。

Re: Vector2次元配列の使い方

Posted: 2015年11月09日(月) 03:14
by あるちゃ
早速の回答有難うございます
v[0],v[1],v[2]ですね、すみません。

push_backについて一つ大きな勘違いをしていたのですが、これは事前に確保した領域にさらに領域を付け加えるのですね。。。
初歩的なことでお恥ずかしいです。

それを踏まえた上でなのですが、事前に要素の領域を確保せず、push_backのみで追加させていくことも可能でしょうか?

コード:

#include <vector>
#include <cstdio>
using namespace std;
 
vector<vector<int> > v[3];
 
int main(int argc, char* argv[])
{
    for (int x = 0; x < 3; ++x) {
        for (int y = 0; y < 10; y++) {
            v[x].push_back(y);
        }
    }
    for (size_t x = 0; x < v.size(); x++) {
        for (size_t y = 0; y < v[x].size(); y++)
            printf(" %2d", v[x][y]);
        printf("\n");
    }
    return 0;
}

Re: Vector2次元配列の使い方

Posted: 2015年11月09日(月) 03:30
by かずま
あるちゃ さんが書きました:それを踏まえた上でなのですが、事前に要素の領域を確保せず、push_backのみで追加させていくことも可能でしょうか?
行だけ確保して、列を push_back() で確保する場合。

コード:

#include <vector>
#include <cstdio>
using namespace std;
 
vector<vector<int> > v(3);
 
int main(int argc, char* argv[])
{
    for (int x = 0; x < 3; ++x) {
        for (int y = 0; y < 10; y++) {
            v[x].push_back(y);
        }
    }
    for (size_t x = 0; x < v.size(); x++) {
        for (size_t y = 0; y < v[x].size(); y++)
            printf(" %2d", v[x][y]);
        printf("\n");
    }
    return 0;
}
行も列も領域を事前に確保しないで、push_back() で確保する場合

コード:

#include <vector>
#include <cstdio>
using namespace std;
 
vector<vector<int> > v;
 
int main(int argc, char* argv[])
{
    for (int x = 0; x < 3; ++x) {
        v.push_back(vector<int>());
        for (int y = 0; y < 10; y++) {
            v[x].push_back(y);
        }
    }
    for (size_t x = 0; x < v.size(); x++) {
        for (size_t y = 0; y < v[x].size(); y++)
            printf(" %2d", v[x][y]);
        printf("\n");
    }
    return 0;
}

Re: Vector2次元配列の使い方

Posted: 2015年11月09日(月) 03:44
by かずま
push_back() の代わりに resize() で領域を確保する場合

コード:

#include <vector>
#include <cstdio>
using namespace std;
 
vector<vector<int> > v;
 
int main(int argc, char* argv[])
{
    v.resize(3);
    for (int x = 0; x < 3; ++x) {
        v[x].resize(10);
        for (int y = 0; y < 10; y++) {
            v[x][y] = y;
        }
    }
    for (size_t x = 0; x < v.size(); x++) {
        for (size_t y = 0; y < v[x].size(); y++)
            printf(" %2d", v[x][y]);
        printf("\n");
    }
    return 0;
}
確保する個数が分かっていれば、push_back() でチビチビ拡張するよりも
resize() で事前に確保するほうが効率が良いでしょう。
もっとも、push_back() も 1個ずつ拡張するのではなく、1回で複数個拡張
します。push_back() のあとで、すぐに capacity() を表示してみてください。
size() は 1ずつ増えますが。ということで、報告をお待ちしています。

Re: Vector2次元配列の使い方

Posted: 2015年11月09日(月) 06:47
by あるちゃ
迅速な回答に感謝致します。
行だけ確保して、列を push_back() で確保する場合。の方法で無事解決できました!

行、列共に動的に設定できるのですね。とても勉強になりました。
また何かありましたら宜しくお願い致します。