alder wrote:... но, я надеюсь, что мысль понятна.
Мне - нет Не могли бы Вы ее как-то развернуть и популяризировать ?
Michael Popov wrote:alder wrote:... но, я надеюсь, что мысль понятна.
Мне - нет
Code: Select all
class file
{
public:
file(const char *name, const char *mode) throw (IOException)
: fh(fopen(name, mode)
{ if (!fh) throw IOException("cannot open file"); }
~file() { fclose(fh); }
void write(void *data, int len) throw (IOException);
void read(void *data, int len) throw (IOException);
// и т.п., я же говорил, за уши это притянуто :-)
private:
FILE *fh;
}
Code: Select all
void f( vector<int>& v )
{
v[0]; // A
v.at(0); // B
}
Code: Select all
vector<int> v;
v.reserve( 2 );
assert( v.capacity() == 2 );
v[0] = 1;
v[1] = 2;
for( vector<int>::iterator i = v.begin();
i < v.end(); i++ )
{
cout << *i << endl;
}
cout << v[0];
v.reserve( 100 );
assert( v.capacity() == 100 );
cout << v[0];
v[2] = 3;
v[3] = 4;
// ...
v[99] = 100;
for( vector<int>::iterator i = v.begin(); i < v.end(); i++ )
{
cout << *i << endl;
}
alder wrote:Code: Select all
void f( vector<int>& v )
{
v[0]; // A
v.at(0); // B
}
В чем разница между строчками А и Б?
alder wrote:Или, вот, чуть поинтереснее:Code: Select all
vector<int> v;
v.reserve( 2 );
assert( v.capacity() == 2 );
v[0] = 1;
v[1] = 2;
for( vector<int>::iterator i = v.begin();
i < v.end(); i++ )
{
cout << *i << endl;
}
cout << v[0];
v.reserve( 100 );
assert( v.capacity() == 100 );
cout << v[0];
v[2] = 3;
v[3] = 4;
// ...
v[99] = 100;
for( vector<int>::iterator i = v.begin(); i < v.end(); i++ )
{
cout << *i << endl;
}
Что здесь неправильно? Покритикуйте стиль.
alder wrote:Кстати, по теме: я как-то наткнулся на интересный сайт - Guru of the Week. Там у них в архиве множество интересных статей из которых как мне кажется можно "наковырять" очень интересные практические вопросы. Вот для примера:Code: Select all
void f( vector<int>& v )
{
v[0]; // A
v.at(0); // B
}
В чем разница между строчками А и Б?
Или, вот, чуть поинтереснее:Code: Select all
vector<int> v;
v.reserve( 2 );
assert( v.capacity() == 2 );
v[0] = 1;
v[1] = 2;
for( vector<int>::iterator i = v.begin();
i < v.end(); i++ )
{
cout << *i << endl;
}
cout << v[0];
v.reserve( 100 );
assert( v.capacity() == 100 );
cout << v[0];
v[2] = 3;
v[3] = 4;
// ...
v[99] = 100;
for( vector<int>::iterator i = v.begin(); i < v.end(); i++ )
{
cout << *i << endl;
}
Что здесь неправильно? Покритикуйте стиль.
alder wrote:
void f( vector<int>& v )
{
v[0]; // A
v.at(0); // B
}
В чем разница между строчками А и Б?
Hamster wrote:Предыдущие ораторы уже отметили часть ошибок в примере, хотя в основном неправильно.
В assert'ах нужно поставить >=.
Hamster wrote:Обращаться к элементам после reserve() не следует. В теории это приводит к undefined behavior. На практике у вас, скорее всего, просто потеряются значения в 0 & 1 при втором вызове reserve().
Hamster wrote:< можно использовать для итераторов с произвольным доступом, к каковым относится итератор в векторе.
Hamster wrote:В данном случае нет никакой разницы, использовать i++ или ++i.
Hamster wrote:После cout'ов в середине забыли endl.
Два раза повторять for(vector<int>::iterator i=... ) нежелательно, так как некоторым старым ( и не очень старым ) компиляторам эта конструкция не нравится.
Boriskin wrote:Приятно было увидеть!alder wrote:
void f( vector<int>& v )
{
v[0]; // A
v.at(0); // B
}
В чем разница между строчками А и Б?
Возможно, замечание несколько в стороне, но реализации STL зависят от платформы и компилера. Пришлось как то столкнуться с тем, что под мелкомягким все было тип-топ, а на Маке (под CodeWarrior) аппа издыхала... Из-за реализации STL.
Mongush wrote:Hamster wrote:Предыдущие ораторы уже отметили часть ошибок в примере, хотя в основном неправильно.
В assert'ах нужно поставить >=.
Почему? Помоему reserve делает capacity именно равной аргументу reserve, если конечно она не была больше.
Hamster wrote:В данном случае нет никакой разницы, использовать i++ или ++i.
Разница есть.