【发布时间】:2016-02-15 04:30:51
【问题描述】:
是否可以使用std::find() 1 次调用来搜索多个元素?示例:std::find(vector.begin(), vector.end(), 0&&1&&D)
谢谢
【问题讨论】:
是否可以使用std::find() 1 次调用来搜索多个元素?示例:std::find(vector.begin(), vector.end(), 0&&1&&D)
谢谢
【问题讨论】:
您不能使用std::find。假设 0&&1&&D 是一个包含三个值的列表,并且您试图在向量中找到具有任何这些值的元素,您可以使用:
std::find_if 带有谓词(lambda 可能是最简单的,例如[](const T& x) { return x == 0 || x == 1 || x == d; },其中T 是您的vector 持有的任何类型),或者
std::find_first_of(链接页面有一个很好的例子)。
【讨论】:
vector[0] == 1、vector[1] == 0、vector[2]= = D。不必在那些确切的位置,但假设一个大小为 i 的向量。同样,它们不必相邻。
for 循环,依次在第一个向量中为每个值调用 find .如果第二个向量比第一个小得多,它可能对缓存不太友好,但我没有理由认为您在程序的性能关键部分中有足够的数据来使其成为实际问题。如果您决定避免这种情况,您可以使用find_first_of,每次找到匹配项时,从您正在寻找的值集中删除匹配的元素,直到它为空(成功)或您点击end。
std::for_each 可能适合你。
std::for_each(vector.begin(),
vector.end(),
[](auto& item) -> void {if (item == <xxx> ) { /* Use the item */ });
您在评论中提问:
这可能是一个单独的问题,但是如果存在某些元素,我可以使用一种方法在向量中搜索吗?
std::any_of 就是这个函数。
bool found = std::any_of(vector.begin(),
vector.end(),
[](auto& item) -> bool { return item == <xxx>; });
【讨论】:
[](auto item) -> bool {return item == <xxx>l}) 是做什么的?
【讨论】:
如果您需要三个值相邻,则自己实现find() 可能是最简单和最简单的选择:
template <class Iterator, class T>
Iterator find_by_three_values(Iterator first, Iterator last, T value1, T value2, T value3)
{
for (; first != last; ++first) {
if (*first == value1
&& first + 1 != last && *(first + 1) == value2
&& first + 2 != last && *(first + 2) == value3) {
return first;
}
}
return last;
}
【讨论】: