我一直在用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/