0

上下文:我在 <-string,vector->map 上使用 std::string 执行 std::find。然后它返回一个向量迭代器,我将返回的迭代器保存在一个常量迭代器中。

问题:我现在想遍历返回的 const-iterator,并字符串比较索引 0 处的每个向量。所以类似于:

while (iterator != map.end())
    if ( myStr == iterator.at(0) )
        break;
    else
        iterator++

这种方法对我来说很好,我想知道是否有更优雅的方法来做这件事,我错过了什么吗?

感谢您对此的帮助=]

4

3 回答 3

2

而不是显式编码搜索,您可以使用std::find_if()

std::vector<std::vector<std::string>> vstring
    {
        { "no",   "yes"   },
        { "help", "yes"   },
        { "true", "false" }
    };

const std::string myStr = "help";
auto f = std::find_if(vstring.begin(), vstring.end(),
            [&](std::vector<std::string>const & vs)
            {
                return !vs.empty() && myStr == vs[0];
            });


if (f != vstring.end())
{
    // Found.
}

请参阅http://ideone.com/nkI7fk上的演示。

于 2013-04-02T15:08:47.970 回答
0

使这个更“优雅”的一种方法是这样的:

// 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
}
于 2013-04-02T15:10:01.767 回答
-2

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

于 2013-04-02T15:08:23.660 回答