C++ 返回迭代器中的搜索向量

C++ 返回迭代器中的搜索向量,c++,map,vector,iterator,find,C++,Map,Vector,Iterator,Find,背景: 我使用映射上的std::字符串执行std::find。然后它返回一个向量迭代器,我将返回的迭代器保存在常量迭代器中 问题: 现在,我想遍历返回的常量迭代器,并对索引0处的每个向量进行字符串比较。比如: while (iterator != map.end()) if ( myStr == iterator.at(0) ) break; else iterator++ 这种方法对我来说很好,我想知道是否有一种更优雅的方法可以做到这一点,我是

背景: 我使用映射上的std::字符串执行std::find。然后它返回一个向量迭代器,我将返回的迭代器保存在常量迭代器中

问题: 现在,我想遍历返回的常量迭代器,并对索引0处的每个向量进行字符串比较。比如:

while (iterator != map.end())
    if ( myStr == iterator.at(0) )
        break;
    else
        iterator++
这种方法对我来说很好,我想知道是否有一种更优雅的方法可以做到这一点,我是否遗漏了什么


谢谢你在这方面的帮助=]

我可以想象有一种非常糟糕的方式。它不是普通的,不应该(甚至必须)使用。重载向量的比较运算符,因此它只比较0个位置。然后使用map::find()方法。很有趣。

您可以使用以下方法来代替显式编码搜索:

std::vector vstring
{
{“否”、“是”},
{“帮助”,“是”},
{“真”、“假”}
};
const std::string myStr=“help”;
auto f=std::find_if(vstring.begin(),vstring.end(),
[&](标准::矢量常数&vs)
{
return!vs.empty()&&myStr==vs[0];
});
如果(f!=vstring.end())
{
//找到了。
}
请参见演示。

一种使其更“优雅”的方法如下:

// C++11 allows `using` to be used instead of `typedef`
using map_type = std::map<std::string, std::vector<some_type>>;

// First find the starting point of our secondary search
const auto itr = map.find(some_string);

// Do secondary search
const auto found = std::find_if(itr, map.end(),
                                [](const map_type::value_type& pair)
                                {
                                    return (!pair.second.empty() &&
                                            pair.second[0] == myStr);
                                });
if (found != map.end())
{
    // Found the item
}
//C++11允许使用`using`代替`typedef`
使用map_type=std::map;
//首先找到我们二次搜索的起点
const auto itr=map.find(一些字符串);
//进行二次搜索
const auto found=std::find_if(itr,map.end(),
[](常量映射类型::值映射类型和对)
{
返回(!pair.second.empty()&&
第二对[0]==myStr);
});
if(find!=map.end())
{
//找到物品了吗
}

如果它能正常工作,而且您也满意,我看不出有什么问题。对我来说也不错。是的,它很有效,但我想知道是否有什么stl魔法可以让它变得更好。我不这么认为,但无论如何,为什么stl魔法能让它变得更好?如果你指的是我认为你所指的STL魔法,那么它已经被过度使用了。我的意思是你可以使用std::find_if(或其他什么),但为什么要麻烦呢。只是让代码更复杂,更不容易理解(当然这是个人观点)。我想你是对的,无论如何,它必须是一个线性搜索。我只是想知道我是否可以将函子传递给搜索算法。但是我没有找到这样的东西=[我认为你可以将一个函子传递给搜索算法。问题是这是否会是一种改进。在我看来,不会,但其他人会不同意。我缺少什么,你为什么要从找到的元素一直搜索到地图的末尾?@Dave这就是OP似乎在做的事情。
// C++11 allows `using` to be used instead of `typedef`
using map_type = std::map<std::string, std::vector<some_type>>;

// First find the starting point of our secondary search
const auto itr = map.find(some_string);

// Do secondary search
const auto found = std::find_if(itr, map.end(),
                                [](const map_type::value_type& pair)
                                {
                                    return (!pair.second.empty() &&
                                            pair.second[0] == myStr);
                                });
if (found != map.end())
{
    // Found the item
}