У меня есть функция, которая находит все несколько элементов в векторе. Если я отправлю в {1,2,3,4,5,1,2,3,3,7}
, он возвращает {1,2,3}
. Мой входной вектор имеет от 100 до 10000 элементов, но я ожидаю, что у вас будет только очень мало разных (!) Дубликатов; около 1-5%.Как прыгать в конец цикла for, но не оставлять его, с goto
Следовательно, я проверяю свой вектор дубликатов, если я уже идентифицировал элемент как повторяющийся несколько раз. Если это так, функция должна перейти к следующему элементу, если они есть. Для этого я использую goto
.
Но мне нужно иметь команду после goto label
. Иначе компилятор жалуется. Есть ли способ избежать этого и сохранить goto? Я знаю, что могу использовать какой-то другой метод, например. устанавливая bool соответственно и используя if(). Однако я считаю, что метод goto прямолинейный.
vector<int> findDublicates(vector<int> const& v) {
// e.g. {1,2,3,4,5,1,2,3,7} -> {1,2,3}
vector<int> dublicates;
for (auto it(v.begin()); it != v.end() - 1;
++it) { // go through each element except the last
for (auto const& i :
dublicates) { // check if this is already a known dublicate
if (i == *it)
goto nextElement; // if so, goto the next element in v
}
for (auto it2(it + 1); it2 != v.end();
++it2) { // else compare it with the "not checked" elements in v
if (*it == *it2) { // if a dublicate is found, keep it
dublicates.emplace_back(*it);
break; // check the next element in v; could also use goto
// nextElement
}
}
nextElement:
cout << " "; // if I remove cout it won't compile: "expected
// primary-expression before '}' token"
}
return dublicates;
}
Команда может быть просто точкой с запятой. Это оператор null, но он должен удовлетворять компилятору. –
'nextElement:;' –
Похож на использование _good old_ для циклов с традиционными частями состояния, а 'break;' statement будет составлять более чистый код C++. –