You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何判断字符串是否在std::vector的任意字符串中及提取相关条目

C++ Vector & String Matching Solutions

Hey there! Let's break down your two C++ questions step by step—they both revolve around matching strings in vectors, which is a super common task.

1. How to check if a string is a substring of any element in a std::vector<std::string>

The standard std::find won't work here because it only looks for exact matches of the entire string. What you need is to check if your target string exists as a substring within any element of the vector.

The best tool for this is std::any_of (from the <algorithm> header), paired with std::string::find to handle the substring check. Here's a quick implementation:

#include <vector>
#include <string>
#include <algorithm>

bool doesVectorContainSubstring(const std::vector<std::string>& vec, const std::string& target) {
    // Iterate through each element in the vector
    return std::any_of(vec.begin(), vec.end(), [&target](const std::string& element) {
        // Check if target is a substring of the current element
        return element.find(target) != std::string::npos;
    });
}

How it works:

  • std::any_of stops as soon as it finds one element that meets the condition (efficient for large vectors)
  • element.find(target) returns the starting index of the substring if found; if not, it returns std::string::npos
  • The lambda captures the target string and checks each vector element against it

2. Extracting entries from a 2D vector that match any target hostname

First, let's clarify the setup I'm assuming (since you mentioned a 2D vector of hostnames and IPs):

  • Your 2D vector looks like std::vector<std::vector<std::string>>, where each inner vector is {hostname, IP address}
  • You have a std::vector<std::string> of target hostnames (like "Mike" or "Sophia") that you want to match as substrings in the hostname field

std::find fails here because it can't handle the 2D structure or substring matching across two containers. Instead, we'll loop through the 2D vector, check each hostname against all targets, and collect matching entries.

Here's a practical example:

#include <vector>
#include <string>
#include <algorithm>

std::vector<std::vector<std::string>> getMatchingHostEntries(
    const std::vector<std::vector<std::string>>& hostIpPairs,
    const std::vector<std::string>& targetHosts) {
    
    std::vector<std::vector<std::string>> matchingEntries;
    
    for (const auto& entry : hostIpPairs) {
        // Skip empty entries to avoid crashes
        if (entry.empty()) continue;
        const std::string& currentHostname = entry[0];
        
        // Check if any target is a substring of the current hostname
        bool isMatch = std::any_of(targetHosts.begin(), targetHosts.end(),
            [&currentHostname](const std::string& target) {
                return currentHostname.find(target) != std::string::npos;
            });
        
        if (isMatch) {
            matchingEntries.push_back(entry);
        }
    }
    
    return matchingEntries;
}

If you need exact hostname matches instead:

If your target list has full hostnames (like "MikePC" instead of "Mike"), replace the isMatch check with:

bool isMatch = std::find(targetHosts.begin(), targetHosts.end(), currentHostname) != targetHosts.end();

Why your original std::find didn't work:

std::find is designed to look for a single exact value in a single container. Your use case requires cross-container matching (checking each hostname against multiple targets) and/or substring checks—tasks that need combining algorithms like std::any_of with string-specific logic.

内容的提问来源于stack exchange,提问作者Jim P.

火山引擎 最新活动