3

我想知道:有没有可能为每个添加额外的条件?我正在考虑类似的事情:

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;
4

3 回答 3

5

您可以使用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)

于 2013-09-13T09:14:05.700 回答
1

不,这是不可能的。您可以为此使用旧的“正常”for循环:

auto iter = std:begin(list)
for (int i = 0; iter != std::end(list); ++iter, ++i)
{
    auto& it = *iter;

    // ...
}
于 2013-09-13T05:37:25.010 回答
1

强制性参考: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);
}
于 2013-09-13T09:22:11.017 回答