【发布时间】:2021-10-18 17:41:19
【问题描述】:
这个函数试图在给定两个向量 A 和 B 的情况下找到一种计划旅程的方法,A[i] 是行程的来源,B[i] 是行程的目的地。 这是代码,但它似乎进入了无限循环,因为对中的值没有得到更新。
vector<string> solve(vector<string> A, vector<string> B) {
unordered_map<string, vector<pair<string, char>>> map;
auto f = map.find(A[0]);
for(int i = 0; i < A.size(); i++){
f = map.find(A[i]);
if(f == map.end())
map[A[i]] = {make_pair(B[i], 'r')};
else
(f->second).push_back(make_pair(B[i], 'r'));
}
auto cmpfn = [](pair<string, char> x, pair <string, char> y){return x.first < y.first;};
for(auto f = map.begin(); f != map.end(); f++){
sort((f->second).begin(), (f->second).end(), cmpfn);
}
vector<string> res;
auto start = map[A[0]];
string dst;
int i;
res.push_back(A[0]);
while(true){
for(i = 0; i < start.size(); i++){
cout << start[i].first << " " << start[i].second << endl;
if(start[i].second == 'r'){
dst = start[i].first;
start.at(i).second = 'b'; // can't be updated
break;
}
}
if(i == start.size())
break;
res.push_back(dst);
start = map[dst];
}
cout << endl;
return res;
}
有人可以帮我找出为什么无法更新该对中的值并提出更好的方法吗?
编辑:我可以通过将auto start = map[A[0]]; 更改为vector<pair<string, char>> &start = map[A[0]]; 来解决问题,因为在之前的方法中我只是更新了vector 的副本。
【问题讨论】:
-
map存储向量的副本。分配给start时,您还会再次复制。当然,当您返回res时,参数向量A和B也会被复制。所有这些复制都是有意(或需要)的吗? -
当您使用调试器一步一步地运行程序时,一次一行,并在每一行执行后检查所有变量的值,您看到了什么?
-
@Someprogrammerdude 不,我想更新 pair.second 的值以将其标记为已访问,这样我就不会重新访问它......那么有更好的方法吗?
-
@SamVarshavchik 我对 pair.second 的值保持不变,这就是存在无限循环的原因,(pair.second 用于标记访问的节点)我想要一种编辑它的方法...
-
现在,您只需要弄清楚为什么它“保持不变”,这也是调试器帮助确定的事情。您的调试器有各种工具,例如显示每个变量的实际内存地址、设置观察点等...祝您好运!
标签: c++ stdvector unordered-map std-pair