Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 矢量搜索中的问题?_C++ - Fatal编程技术网

C++ 矢量搜索中的问题?

C++ 矢量搜索中的问题?,c++,C++,我有一个如下形式的向量(在C++中): 然而,它给了我一个错误 'unable to resolve identifier first' std::find在一个范围内迭代,并将迭代器返回到序列中与提供的值匹配的第一个元素(12,在您的示例中)。迭代器不是容器中的元素,而是对容器中元素的伪引用 必须取消对迭代器的引用才能获得元素。因此,u.begin()->first将是容器初始元素的first值u.begin()。first毫无意义 在任何情况下,要使用除==以外的操作查找匹配元素

我有一个如下形式的向量(在C++中):

然而,它给了我一个错误

     'unable to resolve identifier first'

std::find
在一个范围内迭代,并将迭代器返回到序列中与提供的值匹配的第一个元素(
12
,在您的示例中)。迭代器不是容器中的元素,而是对容器中元素的伪引用

必须取消对迭代器的引用才能获得元素。因此,
u.begin()->first
将是容器初始元素的
first
u.begin()。first
毫无意义

在任何情况下,要使用除
==
以外的操作查找匹配元素,您需要使用带有自定义谓词的
find\u if
。例如,使用lambda表达式:

auto const it(std::find_if(u.begin(), u.end(), [](std::pair<int, int> const& v)
{
    return v.first == 12;
}));

if (it != u.end())
    continue;
auto const it(std::find_if(u.begin(),u.end(),[])(std::pair const&v)
{
返回v.first==12;
}));
如果(it!=u.end())
继续;

它也会返回…这个返回意味着什么…“continue”或“break”它是一个lambda表达式
find_if
将为每个元素调用lambda,如果元素匹配,lambda将返回
true
find_if
然后将迭代器返回到第一个元素,对于该元素,
find_if
返回
true
(或者
u.end()
如果lambda返回
true
,则不返回任何元素)。然后,您需要将迭代器与u.end()进行比较,以查看是否找到了匹配项。在这里,它再次给出了无法解析标识符“v”的情况。James的回答很好地解决了这一问题。我会指出一些其他的事情。首先,请注意
begin()
end()
返回迭代器类型,因此
对它们无效。第二,即使可以对它们进行操作,
end()
也不会引用最后一个元素;它指的是超出该位置的一个位置,因此除非用作终止符,否则永远无效。
vector
包含名为
front()
back()
的特殊非迭代器方法,这些方法在您想要直接检查值时非常有用。(仅供参考;在本例中,您无论如何都不能真正引用元素;请参见James的答案。)如果find return为false,而find return为无穷大,这是很危险的。
     'unable to resolve identifier first'
auto const it(std::find_if(u.begin(), u.end(), [](std::pair<int, int> const& v)
{
    return v.first == 12;
}));

if (it != u.end())
    continue;