ベクトルがあり、実行時に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);
}
}
はい。ただし、各サブベクトルをプッシュする必要もあります。
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);
}
}
ベクトルのベクトルを操作しています。そのため、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配列を保存する場合、これは最適なソリューションではありません。
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;
_
最初に外部ベクトルと内部ベクトルを割り当てずに[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);
}
これがもう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;
}
}
あなたはベクトルのベクトルを持っています。
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;
}
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;
}