#c #dictionary #hashmap #g #c 17
#c #словарь #hashmap #g #c 17 #c 17
Вопрос:
У меня есть следующий код, в котором я инициализирую свою карту inserts
и проверяю, правильно ли были введены данные в первом случае. И затем я снова просматриваю свои данные в случае 2, но это показывает, что они пусты в случае 2, но присутствуют в случае 1. Я никогда не видел такого поведения.
int main() {
int t;
cin>>t;
while(t--) {
int n, m;
cin>>n>>m;
while(m--) {
string s;
map<vector<int>, int> inserts;
int x, y, z, W;
int x1, y1, z1, x2, y2, z2;
cin>>s;
switch(resolveOptions(s)) {
case update:
cin>>x>>y>>z>>W;
inserts.insert({{x,y,z}, W});
cout<<"Inserts in u: ";
showInserts(inserts);
break;
case query:
cin>>x1>>y1>>x1>>x2>>y2>>z2;
cout<<"inserts in q";
showInserts(inserts);
// calculateSum(x1, y1, z1, x2, y2, z2, inserts)<<endl;
break;
}
}
}
showInserts(inserts)
Показывает карту
Я не привык программировать на C .
Комментарии:
1. Пожалуйста, обратите внимание, что «существенные» правки в вашем вопросе после публикации ответов могут вызвать проблемы. Такие изменения могут сделать недействительными ответы, которые были размещены добросовестно. В этом случае реальный ущерб не нанесен, но вы должны быть осведомлены о потенциальных последствиях.
Ответ №1:
В строке map<vector<int>, int> inserts;
объявляется переменная, которая является локальной для функции, в которой она встречается. Каждый раз, когда вызывается эта функция, создается новая «версия» переменной (и инициализируется как пустое map). Когда функция возвращается, inserts
объект уничтожается.
Если вы хотите, чтобы inserts
объект сохранял свои значения между вызовами функции, вам нужно будет объявить его как глобальную переменную (вне / перед функцией).
Тот же принцип справедлив для переменной, которая объявлена внутри цикла for
or while
: область этой переменной составляет одну итерацию цикла; каждый раз, когда выполняется цикл, создается новый экземпляр переменной, и, когда каждая итерация цикла заканчивается, переменная уничтожается. В этом случае вам нужно объявить и инициализировать переменную вне / перед циклом.
Комментарии:
1. пожалуйста, проверьте код еще раз, это фактический код
2. @VedantK Что ж, с некоторыми незначительными изменениями мой ответ остается в силе. (Предполагая, что показанный вами код является телом функции.)
3. код находится внутри цикла, все внутри одной и той же функции. В принципе, никаких вызовов функций
4. @VedantK Смотрите редактирование: работает тот же «принцип» — вы объявляете новую локальную переменную каждый раз, когда запускаете цикл.
Ответ №2:
#include<bits/stdc .h>
using namespace std;
map<vector<int>, int> inserts;
void test(int n) {
int x, y, z, W;
int x1, y1, z1, x2, y2, z2;
cin>>s;
switch(resolveOptions(s)) {
case update:
cin>>x>>y>>z>>W;
inserts.insert({{x,y,z}, W});
cout<<"Inserts in u: ";
showInserts(inserts);
break;
case query:
cin>>x1>>y1>>x1>>x2>>y2>>z2;
cout<<"inserts in q";
showInserts(inserts);
// calculateSum(x1, y1, z1, x2, y2, z2, inserts)<<endl;
break;
}
}
int main() {
test(1);
test(2);
}
Просто объявите map<vector, int> inserts; глобально, чтобы сохранить его значение.
Комментарии:
1.пожалуйста, проверьте код еще раз, это фактический код
2. Обновленный ответ @VedantK. Я надеюсь, что у вас есть все оставшиеся функции в коде.