c++ - std::find的替代方法,它返回所有找到的值,而不是仅存在重复项的vector的第一个

标签 c++ vector iterator duplicates stdvector

我一直在用std::find在具有重复值的 vector 中进行测试
我已经注意到std::find将总是从重复的示例中返回第一个值。当我在 vector vecDup中寻找值2时:

std::vector<int> vecDup = { 0, 5, 1, 2, 2, 4 };

auto valIterator = (std::find(vecDup.begin(), vecDup.end(), 2));
if (valIterator != vecDup.end()) {
    int value = (*valIterator);
    int valueIndex = std::distance(vecDup.begin(), valIterator);
    std::cout << "Duplicate value: " << value << " at index " << valueIndex << std::endl;
}

Duplicate value: 2 at index 3


文档指出std::find:
返回一个迭代器,该迭代器比较等于val的[first,last)范围内的第一个元素。如果找不到此类元素,则该函数最后返回。
所以我想std::find不能用于找到多个值。所以我的问题是,我可以使用哪些(如果有)std方法以一种或另一种形式获取这些多个值?我唯一需要的输出是对存在这些重复项的索引的某种引用。
编辑
我知道这不是一个特别困难的问题,可以使用for循环轻松实现。我只是认为这可能是一个常见问题,并且可能已经有某种内置方法可以实现此目的。

最佳答案

如果我答对了,您想让另一个迭代器指向 vector 中特定元素的每个重复项。然后,总是追求良好的循环:

std::vector<std::vector<int>::iterator> vec_of_dup_iters;
auto it = vecDup.begin();
for(it = std::find(it, vecDup.end(), elem); it != vecDup.end(); it = std::find(it, vecDup.end(), elem)) {
    vec_of_dup_iters.push_back(it++);
}

但是,我建议不要存储索引,而是在需要时生成 vector ,而不是存储许多 vector :
std::vector<unsigned> vec_of_indices;
for(size_t index = 0; index < vecDup.size(); index++) {
    if(vecDup.at(index) == elem) {
        vec_of_indices.push_back(index);
    }
}
然后将索引添加到vecDup.begin()以生成迭代器

关于c++ - std::find的替代方法,它返回所有找到的值,而不是仅存在重复项的vector的第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62641368/

相关文章:

c++ - 在数组c++上调用排序函数

python - 如何在 Python 中找到两个向量具有相等元素的索引集

R 根据自己的意愿对向量进行排序

c++ - 将 vector move 到 unordered_set

c++ - 如何将 std::unordered_multimap<uint, T> 转储到 std::vector<T>?

c++ - 处理 C++ 目标中的 ANTLR3 错误

c++ - 在 Visual Studio、CodeBlocks 和 Eclipse 中使用 C++ 编译/运行问题?

c++ - 为什么我不能更改 lambda 函数中复制捕获的变量的值?

error-handling - 在将filter_map与易错的映射功能一起使用时,如何汇总错误的迭代器?

c++ - 通过索引访问 vector 迭代器?