На самом деле, вы можете вернуть из вашей функции как логическое значение, которое указывает на успех в поиске элемента, так и фактический итератор для указанного элемента c (или найденного значения). Чтобы достичь этого, вы должны использовать функцию C ++ 17 под названием структурированное связывание .
. Вот простой код, который вы затем можете применить к вашему делу:
#include <vector>
#include <utility>
#include <iostream>
#include <algorithm>
std::pair<bool, std::vector<int>::const_iterator> find(std::vector<int> const& v, int number) {
auto it = std::find(v.begin(), v.end(), number);
if (v.end() == it) {
return std::make_pair(false, it);
} else {
return std::make_pair(true, it);
}
}
int main() {
std::vector<int> v = { 1, 2, 3, 4, 5 };
if (auto [success, iter] = find(v, 5); success) {
std::cout << "Found" << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
return 0;
}
Проверьте это вживую .
Применение этой логики c к вашему примеру будет выглядеть следующим образом:
std::pair<bool, std::vector<Vector3f>::const_iterator> Mesh::checkMeshVertices(Vector3f playerPos) {
auto it = std::find(meshVertices.begin(), meshVertices.end(), playerPos);
if (meshVertices.end() == it) {
return std::make_pair(false, it);
} else {
return std::make_pair(true, it);
}
}
ОБНОВЛЕНИЕ
Вы также можете использовать std::optional
вот так:
#include <vector>
#include <iostream>
#include <optional>
#include <algorithm>
std::optional<std::vector<int>::const_iterator> find(std::vector<int> const& v, int number) {
auto it = std::find(v.begin(), v.end(), number);
if (v.end() == it) {
return {}; // or return std::nullopt;
} else {
return it;
}
}
int main() {
std::vector<int> v = { 1, 2, 3, 4, 5 };
auto iter = find(v, 6);
if (iter) {
std::cout << "Found" << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
return 0;
}