サイズがwidth * height
のベクトルまたは配列を初期化する関数を作成したいと思いますが、これらの値の周囲にも境界線が作成されます。辺とベクトルの中心を異なる値で塗りつぶす
外側の値も、中央の値とは異なる値に初期化する必要があります。
私が保存しているオブジェクトにはデフォルトのコンストラクタがありません。初期化には依存できません。
これは私がこれまで持っていたコードですが、これを行うためのより簡単で慣れた方法があるように感じられます。
私はC++ 1zまでの任意の機能を使用できます。
#include <iostream>
#include <vector>
void fill_values(const unsigned width, const unsigned height, std::vector<int> &values) {
for(unsigned y=0; y<height+2; ++y) {
for(unsigned x=0; x<width+2; ++x) {
if(x==0 || x==width+1 || y==0 || y==height+1) {
values.push_back(1);
} else {
values.push_back(0);
}
}
}
}
int main(int argc, char *argv[]) {
const unsigned width = 4;
const unsigned height = 3;
std::vector<int> values;
fill_values(width, height, values);
for(unsigned y=0; y<height+2; ++y) {
for(unsigned x=0; x<width+2; ++x) {
std::cout << values[y * (width+2) + x];
}
std::cout << '\n';
}
return 0;
}
出力: -
111111
100001
100001
100001
111111
なぜ1つのベクトルを使用して行列を表現していますか? ベクトルのベクトルを使うと簡単になります。 – Federico
@Federicoすべての行は同じサイズで、ベクトルはクラスにラップされます。 'get(unsigned x、unsigned y){戻り値[y *幅+ x]; } 'ベクトルのベクトルを初期化するよりも。私はまた、1次元ベクトルが1つの間接指定だけが起こっているのでアクセスが速いだろうと考えています、それは正しいでしょうか? – Caw
あまり明確ではない実装を正当化するためにコードが速くなるとは思わない。 私はこれを見る: 'values [y * width + x]'; '値'が行列であることを知らなければ、それを実現するのにはしばらく時間がかかりました。 – Federico