Пожалуйста, подпишитесь на официальный канал Codeforces в Telegram по ссылке https://t.me/codeforces_official. ×

Блог пользователя Trytrytry

Автор Trytrytry, 13 лет назад, По-русски
Почему некоторые люди пишут вместо квадратных скобок при индексации круглые?

Например вместо array[i][j]  array(i,j) или я что-то путаю?
или array(i) <-> array[i]

p.s. В гугл не знаю как загуглить.
Теги c++
  • Проголосовать: нравится
  • -3
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
Вряд ли это индексация. Конечно, можно перегрузить оператор (), но зачем, когда есть [].

Скорее всего это конструктор, т.е. функция, инициализирующая объект.

Например выражение 
vector <int> a(n); 
создаст вектор (массив) размером n.

А выражение 
vector <int> a(n, 1); 
еще и заполнит этот массив единицами.
  • 13 лет назад, # ^ |
      Проголосовать: нравится +7 Проголосовать: не нравится
    для индексации вполне можно использовать скобочки.
    Я по-моему разочек писал дефайны для индексации. В скобочках через запятую по-моему более наглядно, чем куча квадратных скобок) Иногда еще в динамике, состояние динамики может принимать отрицательные значения, и тогда тоже можно дефайн использовать.
    Например:
    int DM[100][201];
    #define dm(i, j) DM[i][(j) + 100]
    Хотя в последнее время в таком случае я делаю так:
    int DM[100][201];
    int* dm[100];
    ...
    for (int i = 0; i < 100; i++) dm[i] = DM[i] + 100;
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
      Действительно! Про макросы то я и зыбыл...
      Спасибо, возьму на заметку:)
13 лет назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится
Для большей понятности нужен пример кода.
13 лет назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится
Возможно ещё что-то типа
   vector < int > a( 10, 1 );
   cout << a.at(0);
13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Сегодня такой же вопрос задал один из моих олимпиадников. :) Память под большие двумерные массивы я выделяю динамически через new. Чтобы потом не сделать ошибок с индексацией, можно использовать соответствующий макрос:

int *x = new int[n*m];
#define x(i,j) x[m*i + j]

Здесь n -- кол-во строк, m -- кол-во элементов в строке.
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится
    Опасный дефайн. Стоит добавить скобочки вокруг его параметров для избежания потенциальных сложноуловимых ошибок:
    #define x(i,j) x[m*(i) + (j)]
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Все понял, спасибо. 
К сожалению кода найти не смог (не запомнил автора решения), видимо действительно там был просто define на который я внимание не обратил.