【问题标题】:Find all elements in a vector of strings that contain a substring查找包含子字符串的字符串向量中的所有元素
【发布时间】:2016-03-03 16:30:34
【问题描述】:

我有一个包含很多字符串的向量。

v[0] = "Agra"
v[1] = "Amritsar"
v[2] = "Bombay"
v[3] = "Bangalore"

现在我想要的是所有以一个或多个特定字母开头的字符串。

例如:如果输入字母是B,那么我应该得到所有以B 开头的字符串。 如果输入字母是BO,那么所有以BO开头的字符串

除了按顺序迭代向量之外还有什么方法吗?

【问题讨论】:

  • 你知道元素是按照示例数据中的排序顺序存储的,还是只是巧合?如果它们已排序,那么您可以对第一个匹配项执行(修改的)二进制搜索等操作,然后扫描直到该值不再匹配。如果它们没有排序,你就不能这样做;您必须对矢量进行完整扫描。

标签: c++ vector string-matching


【解决方案1】:

您可以使用std::copy_if

std::vector<std::string> v_source = { ... };
std::vector<std::string> v_destination;

std::copy_if(v_source.begin(),
             v_source.end(),
             std::back_inserter(v_destination),
             [](std::string const& s) { return (s.size() > 0 && s[0] == 'B'); }); 

【讨论】:

  • @R Sahu 我认为 copy_if 还将依次遍历 vector 的所有元素。有没有其他办法,我没钱用C++ 11
  • @Gaurav,这是正确的。如果对向量进行了排序,则可以使用std::find_if 查找以'B' 开头的第一个元素,以及之后的第一个不以'B' 开头的元素。然后,您可以将这些迭代器之间的所有项目指向目标向量。如果向量未排序,则必须遍历整个向量。
【解决方案2】:

您可以使用trie 结构化树来存储数据。

【讨论】:

  • 为什么这不是试图回答这个问题。 trie 将完全能够搜索具有非常好的性能的子字符串。
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 2015-05-08
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2015-02-18
相关资源
最近更新 更多