Na verdade, você pode tentar usar a biblioteca de impulso, acho que std :: string não fornece método suficiente para fazer toda a operação de string comum boost::algorithm::contains.
#include<string>#include<boost/algorithm/string.hpp>int main(){
std::string s("gengjiawen");
std::string t("geng");bool b = boost::algorithm::contains(s, t);
std::cout << b << std::endl;return0;}
"Eu acho que std :: string não fornece método suficiente para fazer toda a operação comum de strings". Mas há um findmétodo para exatamente a tarefa em questão. Não há necessidade de introduzir uma dependência de biblioteca.
Stefan
8
@stefan, você está certo, existe um método find, mas e quanto a divisão, substituição e muitos outros funcionários.Você pode comparar std :: string com a string api em Java.PS: Também acho que contém é muito mais elegante do que encontre para verificar se uma string contém outra string.
Geng Jiawen
1
Também é curto e mais fácil de memorizar. O Cpp 17 possui suporte adicional para o sistema de arquivos. Espero que o Cpp 2x também faça algo para string. É muito doloroso a falta de suporte ao método básico de strings no cpp moderno.
Geng Jiawen
1
Você realmente precisa dos "usos"? Quando leio esse código, não faço ideia se containsé std::containsou o boost::containsque parece ser uma desvantagem significativa. Acho que std :: contains não existe atualmente, mas não tenho certeza de que seja razoável supor que o leitor tenha memorizado tudo o que está em std. E std::containspode muito bem existir em alguma versão futura do c ++, o que quebraria esse programa.
Caso a funcionalidade seja crítica para o seu sistema, é realmente benéfico usar um strstrmétodo antigo . O std::searchmétodo interno algorithmé o mais lento possível. Meu palpite seria que leva muito tempo para criar esses iteradores.
O código que eu costumava cronometrar a coisa toda é
Aqui eu giro aleatório haystackse pesquiso neles o needle. A contagem do palheiro é definida, mas o comprimento das seqüências de caracteres em cada palheiro é aumentado de 10 no início para 10240 no final. Na maioria das vezes, o programa gasta realmente gerando seqüências aleatórias, mas isso é esperado.
A saída é:
Generating200000 random haystacks of size 10Starting std::string.find approach
Processing of 200000 elements took 0.00358503 seconds.Starting strstr approach
Processing of 200000 elements took 0.0022727 seconds.Starting std::search approach
Processing of 200000 elements took 0.0346258 seconds.Generating200000 random haystacks of size 20Starting std::string.find approach
Processing of 200000 elements took 0.00480959 seconds.Starting strstr approach
Processing of 200000 elements took 0.00236199 seconds.Starting std::search approach
Processing of 200000 elements took 0.0586416 seconds.Generating200000 random haystacks of size 40Starting std::string.find approach
Processing of 200000 elements took 0.0082571 seconds.Starting strstr approach
Processing of 200000 elements took 0.00341435 seconds.Starting std::search approach
Processing of 200000 elements took 0.0952996 seconds.Generating200000 random haystacks of size 80Starting std::string.find approach
Processing of 200000 elements took 0.0148288 seconds.Starting strstr approach
Processing of 200000 elements took 0.00399263 seconds.Starting std::search approach
Processing of 200000 elements took 0.175945 seconds.Generating200000 random haystacks of size 160Starting std::string.find approach
Processing of 200000 elements took 0.0293496 seconds.Starting strstr approach
Processing of 200000 elements took 0.00504251 seconds.Starting std::search approach
Processing of 200000 elements took 0.343452 seconds.Generating200000 random haystacks of size 320Starting std::string.find approach
Processing of 200000 elements took 0.0522893 seconds.Starting strstr approach
Processing of 200000 elements took 0.00850485 seconds.Starting std::search approach
Processing of 200000 elements took 0.64133 seconds.Generating200000 random haystacks of size 640Starting std::string.find approach
Processing of 200000 elements took 0.102082 seconds.Starting strstr approach
Processing of 200000 elements took 0.00925799 seconds.Starting std::search approach
Processing of 200000 elements took 1.26321 seconds.Generating200000 random haystacks of size 1280Starting std::string.find approach
Processing of 200000 elements took 0.208057 seconds.Starting strstr approach
Processing of 200000 elements took 0.0105039 seconds.Starting std::search approach
Processing of 200000 elements took 2.57404 seconds.Generating200000 random haystacks of size 5120Starting std::string.find approach
Processing of 200000 elements took 0.798496 seconds.Starting strstr approach
Processing of 200000 elements took 0.0137969 seconds.Starting std::search approach
Processing of 200000 elements took 10.3573 seconds.Generating200000 random haystacks of size 10240Starting std::string.find approach
Processing of 200000 elements took 1.58171 seconds.Starting strstr approach
Processing of 200000 elements took 0.0143111 seconds.Starting std::search approach
Processing of 200000 elements took 20.4163 seconds.
A versão mais curta do que a resposta é: usando c em vez de c ++ :)
r0ng
3
Se você não deseja usar as funções padrão da biblioteca, abaixo está uma solução.
#include<iostream>#include<string>boolCheckSubstring(std::string firstString, std::string secondString){if(secondString.size()> firstString.size())returnfalse;for(int i =0; i < firstString.size(); i++){int j =0;// If the first characters matchif(firstString[i]== secondString[j]){int k = i;while(firstString[i]== secondString[j]&& j < secondString.size()){
j++;
i++;}if(j == secondString.size())returntrue;else// Re-initialize i to its original value
i = k;}}returnfalse;}int main(){
std::string firstString, secondString;
std::cout <<"Enter first string:";
std::getline(std::cin, firstString);
std::cout <<"Enter second string:";
std::getline(std::cin, secondString);if(CheckSubstring(firstString, secondString))
std::cout <<"Second string is a substring of the frist string.\n";else
std::cout <<"Second string is not a substring of the first string.\n";return0;}
Você já está usando std :: string, portanto, seu código já depende da std lib. Não vejo nenhuma razão para evitar a solução aceita usando std :: string :: find.
b00n12
Sim, esse é um bom argumento. Não achava isso quando escrevi isso. Acho que o que pensei quando escrevi isso foi talvez como evitar o uso de std :: find.
Testing123
3
Apenas para futuros visitantes: esse algoritmo não está realmente correto. Porque "i" nunca mais vai voltar depois de um jogo substring falhou, alguns casos não são correspondidos, por exemplo considerar: aaabc, AAB
sAm_vdP
1
Isso tem vários erros. CheckSubstring(std::string firstString, std::string secondString)cópias profundas de ambas as cadeias transmitidas para a função, o que é caro, principalmente para cadeias mais longas que exigem alocações de heap. Além disso, digamos que você chame CheckSubstring("XYZab", "ab\0\0")- o whileloop terminará comparando acom a, bpara b, o NUL implícito no final da primeira string com o NUL explícito no segundo, depois ele lerá além do buffer da primeira string, tendo um comportamento indefinido. Para corrigir, use for (... i <= firstString.size () - secondString (). Size (); ...) `.
Tony Delroy
1
Se o tamanho das strings for relativamente grande (centenas de bytes ou mais) e o c ++ 17 estiver disponível, convém usar o pesquisador Boyer-Moore-Horspool (exemplo de cppreference.com):
#include<iostream>#include<string>#include<algorithm>#include<functional>int main(){
std::string in ="Lorem ipsum dolor sit amet, consectetur adipiscing elit,"" sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
std::string needle ="pisci";auto it = std::search(in.begin(), in.end(),
std::boyer_moore_searcher(
needle.begin(), needle.end()));if(it != in.end())
std::cout <<"The string "<< needle <<" found at offset "<< it - in.begin()<<'\n';else
std::cout <<"The string "<< needle <<" not found\n";}
Os sinais dos tempos. Antigamente, alguém teria oferecido uma função bool contains(const std::string& haystack, const std::string& needle). Atualmente, eles oferecem um conjunto de peças de quebra-cabeças com o nome de alguns autores obscuros de papéis obscuros para fazer com que pareça mais com ciência da computação ...
BitTickler 20/02
0
Você também pode usar o espaço para nome do sistema. Então você pode usar o método contains.
#include<iostream>usingnamespaceSystem;int main(){String^ wholeString ="My name is Malindu";if(wholeString->ToLower()->Contains("malindu")){
std::cout<<"Found";}else{
std::cout<<"Not Found";}}
Essa resposta só se aplica a extensão C proprietária da Microsoft ++ quer C ++ / CX ou C ++ / CLI
H. Al-Amri
1
sim, me desculpe, eu não sabia que só funciona dessa maneira até alguns dias depois de postá-lo.
Malindu Dilanka
-1
Esta é uma função simples
bool find(string line, string sWord){bool flag =false;int index =0, i, helper =0;for(i =0; i < line.size(); i++){if(sWord.at(index)== line.at(i)){if(flag ==false){
flag =true;
helper = i;}
index++;}else{
flag =false;
index =0;}if(index == sWord.size()){break;}}if((i+1-helper)== index){returntrue;}returnfalse;}
Olá, bem-vindo ao SO. Você poderia editar sua resposta e adicionar um comentário sobre como ela funciona e como difere de outras respostas? Obrigado!
Fabio diz Restabelecer Monica
-1
#include<algorithm>// std::search#include<string>using std::search;using std::count;using std::string;int main(){
string mystring ="The needle in the haystack";
string str ="needle";
string::const_iterator it;
it = search(mystring.begin(), mystring.end(),
str.begin(), str.end())!= mystring.end();// if string is found... returns iterator to str's first element in mystring// if string is not found... returns iterator to mystring.end()if(it != mystring.end())// string is foundelse// not foundreturn0;}
Obrigado por deixar o código claro, por usar usingapenas as funções necessárias e por não despejar o espaço de nome inteiro no espaço global. Quanto ao comentário do @ SᴀᴍOnᴇᴌᴀ, acho que esse usuário não leu os comentários no seu código.
v010dya
-2
De tantas respostas neste site, eu não encontrei uma resposta clara e, em 5 a 10 minutos, eu mesmo descobri a resposta. Mas isso pode ser feito em dois casos:
Você sabe a posição da sub-string que você procura na string
Ou você não conhece a posição e a procura, char por char ...
Então, vamos supor que procuramos pela substring "cd" na string "abcde" e usamos a função interna mais simples da substr no C ++
por 1:
#include<iostream>#include<string>usingnamespace std;int i;int main(){
string a ="abcde";
string b = a.substr(2,2);// 2 will be c. Why? because we start counting from 0 in a string, not from 1.
cout <<"substring of a is: "<< b << endl;return0;}
para 2:
#include<iostream>#include<string>usingnamespace std;int i;int main(){
string a ="abcde";for(i=0;i<a.length(); i++){if(a.substr(i,2)=="cd"){
cout <<"substring of a is: "<< a.substr(i,2)<< endl;// i will iterate from 0 to 5 and will display the substring only when the condition is fullfilled }}return0;}
De que maneira a resposta principal ("use std :: string :: find"), publicada 8 anos antes, não é clara o suficiente?
Steve Smith
-3
Em vez disso, podemos usar esse método. Apenas um exemplo dos meus projetos. Consulte o código. Alguns extras também estão incluídos.
Olhe para as declarações if!
/*
Every C++ program should have an entry point. Usually, this is the main function.
Every C++ Statement ends with a ';' (semi-colon)
But, pre-processor statements do not have ';'s at end.
Also, every console program can be ended using "cin.get();" statement, so that the console won't exit instantly.
*/#include<string>#include<bits/stdc++.h>//Can Use instead of iostream. Also should be included to use the transform function.usingnamespace std;int main(){//The main function. This runs first in every program.
string input;while(input!="exit"){
cin>>input;
transform(input.begin(),input.end(),input.begin(),::tolower);//Converts to lowercase.if(input.find("name")!= std::string::npos){//Gets a boolean value regarding the availability of the said text.
cout<<"My Name is AI \n";}if(input.find("age")!= std::string::npos){
cout<<"My Age is 2 minutes \n";}}}
std::basic_string::contains
ao stdlib.Respostas:
Use da
std::string::find
seguinte maneira:Nota: "encontrado!" será impresso se
s2
for uma subcadeia des1
amboss1
es2
for do tipostd::string
.fonte
Você pode tentar usar a
find
função:fonte
Na verdade, você pode tentar usar a biblioteca de impulso, acho que std :: string não fornece método suficiente para fazer toda a operação de string comum
boost::algorithm::contains
.fonte
find
método para exatamente a tarefa em questão. Não há necessidade de introduzir uma dependência de biblioteca.contains
éstd::contains
ou oboost::contains
que parece ser uma desvantagem significativa. Acho que std :: contains não existe atualmente, mas não tenho certeza de que seja razoável supor que o leitor tenha memorizado tudo o que está em std. Estd::contains
pode muito bem existir em alguma versão futura do c ++, o que quebraria esse programa.Você pode tentar isso
fonte
Caso a funcionalidade seja crítica para o seu sistema, é realmente benéfico usar um
strstr
método antigo . Ostd::search
método internoalgorithm
é o mais lento possível. Meu palpite seria que leva muito tempo para criar esses iteradores.O código que eu costumava cronometrar a coisa toda é
Aqui eu giro aleatório
haystacks
e pesquiso neles oneedle
. A contagem do palheiro é definida, mas o comprimento das seqüências de caracteres em cada palheiro é aumentado de 10 no início para 10240 no final. Na maioria das vezes, o programa gasta realmente gerando seqüências aleatórias, mas isso é esperado.A saída é:
fonte
Se você não deseja usar as funções padrão da biblioteca, abaixo está uma solução.
fonte
CheckSubstring(std::string firstString, std::string secondString)
cópias profundas de ambas as cadeias transmitidas para a função, o que é caro, principalmente para cadeias mais longas que exigem alocações de heap. Além disso, digamos que você chameCheckSubstring("XYZab", "ab\0\0")
- owhile
loop terminará comparandoa
coma
,b
parab
, o NUL implícito no final da primeira string com o NUL explícito no segundo, depois ele lerá além do buffer da primeira string, tendo um comportamento indefinido. Para corrigir, usefor (...
i <= firstString.size () - secondString (). Size (); ...) `.Se o tamanho das strings for relativamente grande (centenas de bytes ou mais) e o c ++ 17 estiver disponível, convém usar o pesquisador Boyer-Moore-Horspool (exemplo de cppreference.com):
fonte
bool contains(const std::string& haystack, const std::string& needle)
. Atualmente, eles oferecem um conjunto de peças de quebra-cabeças com o nome de alguns autores obscuros de papéis obscuros para fazer com que pareça mais com ciência da computação ...Você também pode usar o espaço para nome do sistema. Então você pode usar o método contains.
fonte
Esta é uma função simples
fonte
fonte
using
apenas as funções necessárias e por não despejar o espaço de nome inteiro no espaço global. Quanto ao comentário do @ SᴀᴍOnᴇᴌᴀ, acho que esse usuário não leu os comentários no seu código.De tantas respostas neste site, eu não encontrei uma resposta clara e, em 5 a 10 minutos, eu mesmo descobri a resposta. Mas isso pode ser feito em dois casos:
Então, vamos supor que procuramos pela substring "cd" na string "abcde" e usamos a função interna mais simples da substr no C ++
por 1:
para 2:
fonte
Em vez disso, podemos usar esse método. Apenas um exemplo dos meus projetos. Consulte o código. Alguns extras também estão incluídos.
Olhe para as declarações if!
fonte