Просто подумал, что я прокомментирую отличный ответ Джонатана.
Игнорируйте синтаксис 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 строк кода поддержки позже (Iterable контейнеры и их доверенные лица не являются тривиальными), и это будет компилировать и работать.
Clever, как это, несомненно, будет, есть некоторые проблемы:
- Там в небольшой вопрос 100 дополнительных строк кода.
- Мне кажется, что этот код на самом деле меньше выразительный, чем ваш. т. е. сразу видно, что делает ваш код. С моим вы должны сделать некоторые предположения или пойти и рассуждать о дополнительных 100 строках кода.
- мой код нужен много больше обслуживания (и документации), чем ваш
Иногда меньше больше.
Sice значения зависят от индексов ... просто оставайтесь с петлями. – deviantfan
Нужно ли инициализировать пустые векторы или заполнить значения векторов, которые уже не пустые? Кроме того, вы хотите заполнить их индексами ('i * j') или любое значение (например,' 0') будет делать? – SingerOfTheFall
@SingerOfTheFall Не уверен, что если я понимаю ваш первый вопрос, мой IMath уже инициализирован, то есть не пуст. Да, значения должны зависеть от индексов. Однако это уже помогло бы мне заполнить его константой. – user463035818