我想知道:有没有可能为每个添加额外的条件?我正在考虑类似的事情:
int i=0;
for(auto &it : list; i++)
if(it.ID == 25)
return i;
或者
for(auto &it : list, int i=0; i++)
if(it.ID == 25)
return i;
您可以使用std::find_if
:
const auto position = std::find_if(list.cbegin(), list.cend(), []((decltype(*list.cbegin()) value)
{
return value.ID == 25;
});
return position - list.cbegin();
(已更新,现在独立于容器 value_type)
不,这是不可能的。您可以为此使用旧的“正常”for
循环:
auto iter = std:begin(list)
for (int i = 0; iter != std::end(list); ++iter, ++i)
{
auto& it = *iter;
// ...
}
强制性参考:Sean Parent 的“Seasoning C++”演讲:
目标 1:避免原始循环
在这种情况下,抽象你的算法!
这会更频繁地出现,所以值得让它通用:
#include <algorithm>
template <typename C, typename Pred>
size_t index_if(C const& c, Pred&& pred)
{
const auto f(begin(c)), l(end(c));
auto match = std::find_if(f, l, std::forward<Pred>(pred));
return (l==match) ? -1 : std::distance(f, match);
}
现在您可以编写查询:
int main()
{
struct X { int ID; };
const std::vector<X> v { {1},{2},{3},{25},{4},{5},{6},{42} };
return index_if(v, [](X const& x) { return x.ID == 25; });
}
在 Coliru 上看到它
PS。您可能需要基于值的版本和基于谓词的版本:
template <typename C, typename V/* = typename C::value_type*/>
size_t index_of(C const& c, V const v)
{
const auto f(begin(c)), l(end(c));
auto match = std::find(f, l, v);
return (l==match) ? -1 : std::distance(f, match);
}