使用迭代器从向量中查找子字符串

时间:2014-12-23 20:21:05

标签: c++ vector iterator substring multimap

我正在尝试在我的应用程序中创建搜索功能。如果用户输入一个子字符串(或完整字符串),我想知道该子字符串是否匹配存储在向量中的任何字符串或部分字符串。

到目前为止编写了以下代码:

cout << "Input word to search for: ";
cin >> searchString;


for (multimap <string, vector<string> >::const_iterator it = contactInformationMultimap.cbegin();       it != contactInformationMultimap.cend(); ++it)
{
    for (vector<string>::const_iterator iter = it->second.cbegin(); iter != it->second.cend(); ++iter)
    {
        if (*iter.find(searchString))
            ^^^^^^^^^^^^^^^^^^^^^^^   this does not work, if i cout *iter it is the correct word                     stored in the vector. The problem is that i can not use the find function.
    }                                 
}

有人有任何建议吗?

3 个答案:

答案 0 :(得分:1)

一元运算符的优先级低于后缀运算符。在if语句中,您需要在成员访问运算符之前评估一元运算符*。所以你必须写

if ( ( *iter ).find(searchString) != std::string::npos )

或者你可以写

if ( iter->find(searchString) != std::string::npos )

考虑到这条记录

if ( ( *iter ).find(searchString) )

毫无意义。

你也可以写

for (multimap <string, vector<string> >::const_iterator it = contactInformationMultimap.cbegin();       it != contactInformationMultimap.cend(); ++it)
{
    for ( const std::string &s : it->second )
    {
        if ( s.find(searchString ) != std::string::npos ) /*...*/;
    }                                 
}

答案 1 :(得分:0)

评论已经说明了如何纠正语法,以便你的代码可以编译,但结果是我仍然(至少是个人)避免的代码。迭代器允许在泛型算法中使用的主要原因。在这种情况下,通用算法可以很好地完成这项工作。例如,假设您希望打印出与该键相关联的值包含searchString中任何值的每条记录的键。为此,您可以编写如下代码:

std::copy_if(data.begin(), data.end(),    // The source "range"
    std::ostream_iterator<T>(std::cout, "\n"), // the destination "range"
    [&](T const &v) {
        return std::any_of(v.second.begin(), v.second.end(),
            [&](std::string const &s) {
                return s.find(searchString) != std::string::npos;
            }
        );
    }
);

这取决于operator<<的正确类型,如下所示:

typedef std::pair < std::string, std::vector<std::string>> T;

namespace std {
    std::ostream &operator<<(std::ostream &os, T const &t) {
        return os << t.first;
    }
}

完整的测试程序可能如下所示:

#include <map>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
#include <string>

typedef std::pair < std::string, std::vector<std::string>> T;

namespace std {
    std::ostream &operator<<(std::ostream &os, T const &t) {
        return os << t.first;
    }
}

int main() { 

    std::multimap<std::string, std::vector<std::string>> data{
        { "key1", { "Able", "Bend", "Cell" } },
        { "key2", { "Are", "Dead" } },
        { "key3", { "Bad", "Call" } }
    };

    std::string searchString = "a";

    std::copy_if(data.begin(), data.end(),
        std::ostream_iterator<T>(std::cout, "\n"),
        [&](T const &v) {
            return std::any_of(v.second.begin(), v.second.end(),
                [&](std::string const &s) {
                    return s.find(searchString) != std::string::npos;
                }
            );
        }
    );
}

结果:

key2
key3

答案 2 :(得分:0)

您可以使用:if ( *iter.find(searchString) != string::npos )