如何将 std::vector 项与 std::map 的关键元素进行比较
How to compare std::vector items with key elements of std::map
我正在尝试更改向量中的项,如果它们与地图的键值匹配,例如vector中的a“2”被“two”代替,也就是map的key“2”的值
我不知道如何比较这两个元素,因为我不能做类似的事情:
矢量[我| == map_iterator->第一个
我知道还有其他方法可以做到这一点(switch 语句等),但我仍然想知道是否可以用这种方式比较 std::vector 和 std::map。
代码:
#include <iostream>
#include <string>
#include <map>
#include <vector>
int main()
{
std::map<int, std::string> numbers;
numbers.insert(std::pair<int, std::string>(0, "zero"));
numbers.insert(std::pair<int, std::string>(1, "one"));
numbers.insert(std::pair<int, std::string>(2, "two"));
numbers.insert(std::pair<int, std::string>(3, "three"));
numbers.insert(std::pair<int, std::string>(4, "four"));
numbers.insert(std::pair<int, std::string>(5, "five"));
numbers.insert(std::pair<int, std::string>(6, "six"));
numbers.insert(std::pair<int, std::string>(7, "seven"));
numbers.insert(std::pair<int, std::string>(8, "eight"));
numbers.insert(std::pair<int, std::string>(9, "nine"));
numbers.insert(std::pair<int, std::string>(10, "ten"));
std::map<int, std::string>::iterator itr = numbers.begin();
std::vector<std::string> str_v ={"What", "The", "2", "4", "12"};
for( int i = 0; i < str_v.size(); i++)
{
for(numbers.begin(); itr != numbers.end(); itr++)
{
if(str_v[i] == itr->first) //this is the problem!
{
str_v[i] = numbers[i];
}
}
std::cout << "Element of vector: " << str_v[i] << std::endl;
}
return 0;
}
`````````
这不是将 std::vector
与 std::map
进行比较的问题,而是将 std::string
(又名 std::vector<std::string>::value_type
)与 int
进行比较的问题(又名 std::map<int, std::string>::key_type
)。我们可以通过以下方式重现错误:
#include <string>
int main()
{
std::string foo = "foo";
int bar = 2;
bool oops = foo == bar; // same error here
}
您需要将 std::string
转换为 int
(通过 std::stoi()
)或将 int
转换为 std::string
(通过 std::to_string()
), 例如:
if(std::stoi(str_v[i]) == itr->first)
if(str_v[i] == std::to_string(itr->first))
请记住,这两种方式都不是真正有效的,因为您调用了 stoi()
/to_string()
str_v.size() * numbers.size()
次。相反,使用具有正确密钥类型的 std::map
,然后使用其 find()
方法来获取对数时间查找。
迭代向量,如果项目是数字,在地图中查找它。如果找到,则用地图值替换该项目。重复直到完成。
for (auto &item : str_v)
{
int key;
std::stringstream ss(item);
if (ss >> key)
{
auto itr = numbers.find(key);
if (itr != numbers.end())
item = itr->second;
}
}
为您的示例输入生成:
What The two four 12
我正在尝试更改向量中的项,如果它们与地图的键值匹配,例如vector中的a“2”被“two”代替,也就是map的key“2”的值
我不知道如何比较这两个元素,因为我不能做类似的事情: 矢量[我| == map_iterator->第一个
我知道还有其他方法可以做到这一点(switch 语句等),但我仍然想知道是否可以用这种方式比较 std::vector 和 std::map。
代码:
#include <iostream>
#include <string>
#include <map>
#include <vector>
int main()
{
std::map<int, std::string> numbers;
numbers.insert(std::pair<int, std::string>(0, "zero"));
numbers.insert(std::pair<int, std::string>(1, "one"));
numbers.insert(std::pair<int, std::string>(2, "two"));
numbers.insert(std::pair<int, std::string>(3, "three"));
numbers.insert(std::pair<int, std::string>(4, "four"));
numbers.insert(std::pair<int, std::string>(5, "five"));
numbers.insert(std::pair<int, std::string>(6, "six"));
numbers.insert(std::pair<int, std::string>(7, "seven"));
numbers.insert(std::pair<int, std::string>(8, "eight"));
numbers.insert(std::pair<int, std::string>(9, "nine"));
numbers.insert(std::pair<int, std::string>(10, "ten"));
std::map<int, std::string>::iterator itr = numbers.begin();
std::vector<std::string> str_v ={"What", "The", "2", "4", "12"};
for( int i = 0; i < str_v.size(); i++)
{
for(numbers.begin(); itr != numbers.end(); itr++)
{
if(str_v[i] == itr->first) //this is the problem!
{
str_v[i] = numbers[i];
}
}
std::cout << "Element of vector: " << str_v[i] << std::endl;
}
return 0;
}
`````````
这不是将 std::vector
与 std::map
进行比较的问题,而是将 std::string
(又名 std::vector<std::string>::value_type
)与 int
进行比较的问题(又名 std::map<int, std::string>::key_type
)。我们可以通过以下方式重现错误:
#include <string>
int main()
{
std::string foo = "foo";
int bar = 2;
bool oops = foo == bar; // same error here
}
您需要将 std::string
转换为 int
(通过 std::stoi()
)或将 int
转换为 std::string
(通过 std::to_string()
), 例如:
if(std::stoi(str_v[i]) == itr->first)
if(str_v[i] == std::to_string(itr->first))
请记住,这两种方式都不是真正有效的,因为您调用了 stoi()
/to_string()
str_v.size() * numbers.size()
次。相反,使用具有正确密钥类型的 std::map
,然后使用其 find()
方法来获取对数时间查找。
迭代向量,如果项目是数字,在地图中查找它。如果找到,则用地图值替换该项目。重复直到完成。
for (auto &item : str_v)
{
int key;
std::stringstream ss(item);
if (ss >> key)
{
auto itr = numbers.find(key);
if (itr != numbers.end())
item = itr->second;
}
}
为您的示例输入生成:
What The two four 12