Передача карт в функции с помощью указателей или ссылки? - PullRequest
0 голосов
/ 18 сентября 2018

У меня следующий вопрос: как правильно передать карту (или вектор и т. Д.) В функцию в c ++, когда передача по значению или константной ссылке не возможна, поскольку карту необходимо изменить в пределахФункция и изменения должны быть видны также вне функции?

Моя функция test1 вызывает ошибку сегментации 11. Это происходит потому, что указатель явно не несет никакой информации о размере?

Функция test2 работает как надо, но flymake-google-cpplint говорит: «Это неконстантная ссылка? Если да, создайте const или используйте указатель».

#include <iostream>
#include <map>
using namespace std;

void test1(map<int, int> *memo) {
  auto it = memo->find(1);
}

void test2(map<int, int> &memo) {

}

int main() {

  map<int, int> *memo;
  memo->insert(make_pair(1,1));

  return 0;
}

Какое решение вы бы порекомендовали?

Большое спасибо

M

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Прежде всего, у вас есть ошибка в вашем коде.

map<int, int> *memo;

никогда не инициализируется, поэтому вы получаете ошибку сегментации.На самом деле вы хотите пропустить указатель

map<int, int> memo;

и передать объект либо по ссылке, либо по указателю на объект (test1(&memo);).

Причина, по которой вы получаете предупреждение от flymake-google-cpplint потому, что использование неконстантных ссылок делает неясным, будет ли объект мутирован (изменен), см. здесь для получения дополнительной информации.

Я бы проигнорировал предупреждение от flymake-google-cpplint и использовал бы непостоянную ссылку.Это в основном субъективная вещь, и до тех пор, пока вы согласны с использованием const, предполагаемое использование ваших функций должно быть ясным.

0 голосов
/ 18 сентября 2018

Вы пытаетесь вставить в неинициализированный указатель map<int, int>

map<int, int> *memo;
memo->insert(make_pair(1,1));

Передача по ссылке, в этом нет ничего плохого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...