私はジョナサンの優れた答えについてさらにコメントしたいと思っていました。
今のところC++ 11の構文を無視して、いくつかのサポートクラスを書いていると想像してください(今はどうでもいい)。
我々はおそらく、このようなコードを思い付くことができます:
auto main() -> int
{
// define a matrix (vector of vectors)
IMat mat;
// resize it through some previously defined function
resize(mat, 10, 10);
// get an object that is a pseudo-container representing its extent
auto extent = extent_of(mat);
// generate values in the pseudo-container which forwards to the matrix
std::generate(extent.begin(),
extent.end(),
[](auto pxy) { pxy.set_value(pxy.x * pxy.y); });
// or even
for (auto pxy : extent_of(mat)) {
pxy.set_value(product(pxy.coordinates()));
}
return 0;
}
100以降のサポートコードの行数(反復可能なコンテナとそのプロキシは些細ではありません)、これはコンパイルして動作します。
賢い、それは間違いなく、いくつかの問題があることになるよう:
- はコードの100個の余分な行の小さな問題があります。
- このコードは実際にはより表現力があり、よりも小さいと思われます。すなわち、あなたのコードが何をしているのかがすぐに分かります。私の場合は、いくつかの前提を設けたり、100行余分なコードについて推論しなければなりません。
- 私のコードは、あなた
時々小さいがよりあるより多くよりメンテナンス(およびドキュメント)が必要です。
シースの値はインデックスに依存します...ただループに留まります。 – deviantfan
空のベクトルを初期化する必要がありますか、すでに空でないベクトルの値を入力する必要がありますか?また、インデックスベースの値( 'i * j')、または任意の値(たとえば' 0')で行うこともできますか? – SingerOfTheFall
@SingerOfTheFallあなたの最初の質問を理解しているかどうかわかりません、私の 'IMat'は既に初期化されています、つまり空ではありません。はい、値はインデックスに依存する必要があります。しかし、それはすでに定数でそれを埋めるために役立つだろう。 – user463035818