【问题标题】:How to specify a range for begin() and end() iterators to find first value of sub vector in a vector of vectors?如何指定 begin() 和 end() 迭代器的范围以在向量向量中查找子向量的第一个值?
【发布时间】:2021-08-06 18:46:35
【问题描述】:

您好,我是使用向量和 STL 其他部分的新手,我需要一些帮助,我有一个字符串向量向量,在每个子向量的索引处包含一个主题 例如 arr[1][0] = "topic1",其中 arr[1][1..n] 包含与 "topic1" 相关的消息,

为了找到 topicID 的值,包含主题的子向量的索引,我使用 find() 和 begin() 和 end() 迭代器,并有效地检查所有值直到匹配,这是非常效率低,因为我知道主题总是在 arr[i][0],随着主题中有 n 条消息,复杂性会变得更糟。

我目前的方法如下所示, 如何重构它以仅检查 arr[i][0] 处的元素的 arr 长度?

int getTopicID(vector< vector<string> >& arr, string topic)
{
    int topicID = 0;
    for (size_t m = 1; m < arr.size(); ++m)
    {
        auto i = find(arr[m].begin(), arr[m].end(), topic); 
        if (arr[m].end() != i) { topicID = m; break; }
        else { topicID = 0;}
    }
    return topicID;
} 

感谢您的帮助:)

【问题讨论】:

  • if ( arr[m][0] == topic )?

标签: c++ arrays vector stl


【解决方案1】:

如何重构它以仅检查 arr[i][0] 处的元素的 arr 长度?

不要循环遍历所有元素(std::find 是不必要的内部循环)。将外部循环的主体替换为:

if (arr[m][0] == topic) {
    return m;
}

在循环之后:

return 0;

附:您可以将外部循环替换为std::find_if

【讨论】:

  • 哦,天哪,我真的把这个问题复杂化了,谢谢你的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多