map<string,int>的find函数使用
时间: 2024-05-10 21:21:28 浏览: 83
map<string,int>::find函数用于在map容器中查找指定的键值是否存在,如果存在,则返回该键值对应的迭代器,否则返回map::end迭代器。
例如,以下代码查找map容器中是否存在键值为"apple"的元素:
```c++
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> fruitMap;
fruitMap["apple"] = 10;
fruitMap["banana"] = 20;
map<string, int>::iterator iter = fruitMap.find("apple");
if (iter != fruitMap.end()) {
cout << "apple: " << iter->second << endl;
}
else {
cout << "apple not found" << endl;
}
return 0;
}
```
输出结果为:
```
apple: 10
```
相关问题
map<int,int> v={"1,2","2,3"}; for (map<int,int>::iterator it=v.begin();it!=v.end()){ cout<<*it->first<<endl; },我这么写可以吗
这段代码看起来是在使用C++语言,并尝试遍历一个键值对为`int:int`的`map`容器`v`。然而,这里的初始化方式有问题,`map<int,int> v={"1,2","2,3"};` 是无效的,因为`map`的构造函数通常需要使用花括号 `{}` 来指定键值对,而不是逗号分隔的字符串列表。
正确的做法应该是将字符串分割成键和值,并逐个添加到`map`中,例如:
```cpp
#include <map>
#include <string>
#include <sstream>
std::map<int, int> v;
std::string pair_str = "1,2,2,3"; // 假设这是你要插入的数据
std::istringstream iss(pair_str);
std::string item;
while (iss >> item) {
size_t pos = item.find(",");
if (pos != std::string::npos) {
int key = std::stoi(item.substr(0, pos));
int value = std::stoi(item.substr(pos + 1));
v[key] = value;
}
}
// 现在你可以遍历 map
for (auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it->first << " : " << it->second << std::endl;
}
```
然后执行`cout<<*it->first<<endl;`这一行,应该可以打印出键对应的值。但是请注意,原始代码中的`*it->first`只会输出第一个元素的键,因为你没有保存迭代器,每次循环都会更新`it`指向下一个元素。
优化finding函数,#include<algorithm> #include<iostream> #include<vector> #include<string> #include<cmath> #include <cstdio> #include <map> #include <unordered_map> #include <queue> using namespace std; const int INF = 0x3f3f3f3f; int n, gamma, time_count=0; int time[10]; string alpha; vector<int> Length(50005, 0); unordered_map<string, int> number; unordered_map<int, string> nega_number; vector<unordered_map<int, int>> edge(50005); vector<int> trace(50005, 0); vector<int> final_trace; void finding(string alpha) { int a=number[alpha], b; char beta; string epsilon; for(int i=9; i>=0; i--) { for(int j=1; j<10; j++) { epsilon = alpha; epsilon[i] = '0' + (int(epsilon[i]) + j) % 10; if(number.find(epsilon) != number.end() and epsilon != alpha) { b = number[epsilon]; edge[a][b]= time[i]; } } for(int j=i-1; j>=0; j--) { epsilon = alpha; beta = epsilon[j]; epsilon[j] = epsilon[i]; epsilon[i] = beta; if(number.find(epsilon) != number.end() and epsilon != alpha) { b = number[epsilon]; edge[a][b]= time[j]; } } } } void dijkstra(int i) { priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q; vector<bool> vis(n+1, false); q.push({0, i}); Length[i] = 0; while(!q.empty()) { int u = q.top().second; q.pop(); if(vis[u]) continue; vis[u] = true; for(auto j : edge[u]) { int v = j.first, w = j.second; if(Length[v] > Length[u] + w) { Length[v] = Length[u] + w; trace[v] = u; q.push({Length[v], v}); } } } } int main() { cin>>n; for(int i=2; i<n+1;i++) { Length[i] = INF; } for(int i=0; i<10; i++) { cin>>time[i]; } for(int i=0; i<n; i++) { cin>>alpha; nega_number[i] = alpha; number[alpha] = i+1; } for(int i=0; i<n; i++) { alpha = nega_number[i]; finding(alpha); } dijkstra(1); if(Length[n] == INF) { cout<<"-1"; } else { gamma = n; final_trace.push_back(gamma); cout<<Length[n]<<endl; while(gamma != 1) { gamma = trace[gamma]; final_trace.push_back(gamma); } cout<<final_trace.size()<<endl; for(int i=final_trace.size()-1;i>-1;i--) { cout<<final_trace[i]<<" "; } } system("pause"); return 0; }
可以对finding函数进行以下优化:
1. 将string类型的alpha改为int类型的a,避免在函数中多次进行string和int类型的转换。
2. 将时间复杂度较高的除法运算改为直接进行取余运算。
优化后的代码如下:
```c++
void finding(int a) {
int b;
string epsilon;
for (int i = 9; i >= 0; i--) {
for (int j = 1; j < 10; j++) {
epsilon = to_string(a);
epsilon[i] = '0' + (epsilon[i] - '0' + j) % 10;
if (number.find(epsilon) != number.end() && epsilon != to_string(a)) {
b = number[epsilon];
edge[a][b] = time[i];
}
}
for (int j = i - 1; j >= 0; j--) {
epsilon = to_string(a);
char beta = epsilon[j];
epsilon[j] = epsilon[i];
epsilon[i] = beta;
if (number.find(epsilon) != number.end() && epsilon != to_string(a)) {
b = number[epsilon];
edge[a][b] = time[j];
}
}
}
}
```
另外,建议将system("pause")移除,因为它只在Windows系统上有效,在其他系统上可能会出现问题。可以使用cin.get()或者getchar()代替。
阅读全文