如何将 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::vectorstd::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