Mam vector<string> vectorStrings
z wartościami: ta, bc, ac, st, cer, cda
. Chcę znaleźć pierwsze wystąpienie któregokolwiek z ciągów w wektorze w ciągu wejściowym.Znajdź pierwsze wystąpienie ciągu znaków z wektora <string>
np.
InputStr = "this certainly helps";
danego ciągi w wektorze, chciałbym sposób powiedzieć "cer"
było pierwsze wystąpienie w pozycji 5
.
int min = 9999999;
string first;
for(int i = 0; i < vectorStrings.size(); i++)
{
int pos = InputStr.find(vectorStrings[i]);
if(pos == string::npos)
continue;
if(pos < min)
{
min = pos;
first = vectorStrings[i];
}
}
// values of min and first gives which string occurred first
// and at the position of it in the input string
Ta implementacja działa, ale chciałbym wiedzieć, czy istnieje bardziej elegancki sposób to zrobić z bibliotekami podwyższenie lub std biblioteki.
pracuję na Windows i przy użyciu Visual Studio 2010.
nie wiem o elegancki, ale myślę, że zewnętrzna pętla powinna przejść znaki łańcuchowe i wewnętrzna pętla (w twoim przypadku - znajdź) nad ciągami w twoim wektorze. Myślę, że byłby bardziej wydajny –
Możesz zrobić min 'string :: size_type min = string :: npos;' (co może również pozwolić ci pozbyć się testu 'pos == npos'). – UncleBens
Możesz użyć iteratora. ;) –