如何找出字符串是不是包含在 std::vector 的任何字符串中?
Posted
技术标签:
【中文标题】如何找出字符串是不是包含在 std::vector 的任何字符串中?【英文标题】:How to find out if a string is contained in any string of a std::vector?如何找出字符串是否包含在 std::vector 的任何字符串中? 【发布时间】:2018-03-08 20:37:54 【问题描述】:有一个主机名向量,我想从另一个向量中提取任何包含任何字符串的主机名。
假设我有一个包含主机名和 IP 地址的二维向量:
std::vector<std::vector<string>> hostnames = "Mike-computer","1.2.3.4",
"John-computer","5.6.7.8",
"Monica-computer","9.10.11.12";
还有另一个包含目标主机名的向量:
std::vector<string> targets = "Mike", "Sophia";
如果hostnames
向量中的任何行包含"Mike"
或"Sophia"
,则提取其信息。在此示例中,"Mike-Computer"
将被删除,因为它包含来自我的 targets
向量的 "Mike"
。
我在this thread 上发现我可以在我的targets
向量上使用std::find
,但如果它不完全匹配,它将无法工作。只有当我特别说 "Mike-computer"
但我不知道我查询的计算机的完整主机名时,它才会起作用。
这是一段代码:
for (std::vector<std::vector<std::string>>::iterator row = hostnames.begin(); row != hostnames.end(); ++row)
for (std::vector<std::string>::iterator col = row->begin(); col != row->end(); ++col)
if ((std::find(targetsList.begin(), targetsList.end(), *col) != targetsList.end()))
std::cout << *col << " is a match" << std::endl;
【问题讨论】:
如果要使用<algorithm>
,搜索子序列的正确算法是std::search
,而不是std::find
。
它是在索引 0 还是其他任何地方都重要吗?
【参考方案1】:
std::string
有一个find
成员函数,它会查找一个字符串是否存在于另一个字符串中。您可以使用它来查看主机名是否包含目标名称,例如
for (const auto& host : hostnames)
for (const auto& target : tagets)
if (host[0].find(target) != std::string::npos)
std::cout << "Found: " << host[0] << " with IP: " << host[1];
我还想建议,如果您总是只有一个主机名和 IP 对,您可以使用一个实际的数据结构,例如
struct Computer
std::string name;
std::string IP;
;
这样
if (host[0].find(target) != std::string::npos)
std::cout << "Found: " << host[0] << " with IP: " << host[1];
看起来像
if (host.name.find(target) != std::string::npos)
std::cout << "Found: " << host.name << " with IP: " << host.IP;
或者至少使用std::pair<std::string, std::string>
,这样代码中就没有“幻数”。
【讨论】:
我对两种方式都进行了测试,它们找到了正确数量的主机以上是关于如何找出字符串是不是包含在 std::vector 的任何字符串中?的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中检查 std::vector<string> 是不是包含某个值 [重复]
std::vector 在清除或删除 POD 时的行为是不是不同
如何在不导致复制的情况下将 char 数据附加到 std::vector