web-dev-qa-db-ja.com

int型の2DベクトルのデータをPush_backするにはどうすればよいですか

ベクトルがあり、実行時にintデータを格納したいのですが、この方法でデータを2Dベクトルに格納できますか?

std::vector<std::vector <int>> normal:
    for(i=0;i<10;i++){
        for(j=0;j<20;j++){
            normal[i].Push_back(j);
    }
}
4
saru

はい。ただし、各サブベクトルをプッシュする必要もあります。

std::vector<std::vector <int> > normal:
for(int i=0;i<10;i++)
{
    normal.Push_back(std::vector<int>());
    for(int j=0;j<20;j++)
    {    
        normal[i].Push_back(j);    
    }
}
6
SingerOfTheFall

ベクトルのベクトルを操作しています。そのため、normalを宣言するときは空であり、要素は含まれていません。

次のいずれかを行うことができます。

要素を挿入する前にベクターのサイズを変更します

_std::vector<std::vector<int> > normal;
normal.resize(20);

for (size_t i = 0; i < normal.size(); ++i)
{
    for (size_t j = 0; j < 20; ++j)
        normal[i].Push_back(j);
}
_

これは、他の回答で提案されているように、各ステップで空のベクターをプッシュするよりもわずかに効率的です。

フラットな2D配列を使用する

2D配列を保存する場合、これは最適なソリューションではありません。

  1. 配列データは、動的に割り当てられるN個の異なるバッファーに分散されます(N行の場合)
  2. 配列は、行ごとに異なる列数を持つことができます(normal[i].size() == normal[j].size()

代わりに、サイズ_N * M_のベクトル(Nは行数、Mは列数)を使用して、行iおよび列jインデックス_i + j * N_を使用:

_size_t N = 20;
size_t M = 20;
std::vector<int> normal;
normal.resize(N * M);

for (size_t i = 0; i < N; ++i)
    for (size_t j = 0; j < M; ++j)
        normal[i + j * N] = j;
_
3
A. Monti

最初に外部ベクトルと内部ベクトルを割り当てずに[i]に直接割り当てることはできません。これに対する1つの解決策は、forループ内に内部ベクトルを作成し、それらが入力されたら、外部ベクトルにPush_backすることです。

std::vector<std::vector<int>> normal;
for(i=0;i<10;i++)
{
    std::vector<int> temp;
    for(j=0;j<20;j++)
    {
        temp.Push_back(j);
    }
    normal.Push_back(temp);
}
0
CoryKramer

これがもう1つのアプローチです。

#include <iostream>
#include <iomanip>
#include <vector>
#include <numeric>

int main() 
{
    std::vector<std::vector <int> > normal;
    normal.resize( 10, std::vector<int>( 20 ) );

    for ( auto &v : normal ) std::iota( v.begin(), v.end(), 0 );

    for ( const auto &v : normal )
    {
        for ( int x : v ) std::cout << std::setw( 2 ) << x << ' ';
        std::cout << std::endl;
    }
}

プログラム出力は

 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 

対応する関数を書くことができます

#include <iostream>
#include <iomanip>
#include <vector>
#include <numeric>

template <typename T>
T & init_2d( T &container, size_t m, size_t n )
{
    container.resize( m, typename T::value_type( n ) );

    for ( auto &item : container ) std::iota( item.begin(), item.end(), 0 );

    return container;
}

int main() 
{
    std::vector<std::vector<int>> v;

    for ( const auto &v : init_2d( v, 10, 20 ) )
    {
        for ( int x : v ) std::cout << std::setw( 2 ) << x << ' ';
        std::cout << std::endl;
    }

}   
0

あなたはベクトルのベクトルを持っています。

normal [i]作成していないため存在しません。

std::vector<std::vector <int> > normal:
for(i=0;i<10;i++){
    normal.emplace_back();
    for(j=0;j<20;j++){
        normal.back().Push_back(j);
    }
}

for(i=0;i<10;i++){
    for(j=0;j<20;j++){
        std::cout << normal[i][j] << " ";
    }
    std::cout << std::endl;
}
0
user3853544

N個の空のベクトル、つまり各インデックスに空のベクトルを割り当てます。次に、Push_back()を適用できます。

int main()
{
    int n = 10;
    std::vector<std::vector<int>> normal;
    normal.resize(n);   //Allocating 'n' empty vectors
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 20; j++)
        {
             normal[i].Push_back(j);
        }
    }
    return 0;
}
0
Umang Kalra