C ++ में स्ट्रिंग से रिक्त स्थान निकालने का पसंदीदा तरीका क्या है? मैं सभी पात्रों के माध्यम से लूप कर सकता हूं और एक नया स्ट्रिंग बना सकता हूं, लेकिन क्या कोई बेहतर तरीका है?
C ++ में स्ट्रिंग से रिक्त स्थान निकालने का पसंदीदा तरीका क्या है? मैं सभी पात्रों के माध्यम से लूप कर सकता हूं और एक नया स्ट्रिंग बना सकता हूं, लेकिन क्या कोई बेहतर तरीका है?
जवाबों:
एल्गोरिथ्म remove_if
और आइसस्पेस का उपयोग करने के लिए सबसे अच्छी बात यह है :
remove_if(str.begin(), str.end(), isspace);
अब एल्गोरिथ्म स्वयं कंटेनर को नहीं बदल सकता (केवल मानों को संशोधित कर सकता है), इसलिए यह वास्तव में चारों ओर के मूल्यों को फेरबदल करता है और एक पॉइंटर को देता है जहां अंत अब होना चाहिए। इसलिए हमें स्ट्रिंग :: इरेज़ को वास्तव में कंटेनर की लंबाई को संशोधित करने के लिए कॉल करना होगा:
str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
हमें यह भी ध्यान देना चाहिए कि डेटा की अधिकांश एक प्रति को remove_if बनाएगा। यहाँ एक नमूना कार्यान्वयन है:
template<typename T, typename P>
T remove_if(T beg, T end, P pred)
{
T dest = beg;
for (T itr = beg;itr != end; ++itr)
if (!pred(*itr))
*(dest++) = *itr;
return dest;
}
erase
बाद में कॉल करने की आवश्यकता है । वह सही परिणाम लौटाएगा।
isspace
मूल 7-बिट ASCII को छोड़कर सभी वर्ण सेटों के लिए UB है। C99 §7.4 / 1। यह मुझे आश्चर्यचकित नहीं करता है कि यह अब तक 71 वोटों की धुन पर अपटेड है, वेरी वेरी एडवाइस होने के बावजूद।
isspace
सभी गैर-एएससीआईआई पात्रों के लिए नकारात्मक मान (ईओएफ से अलग) से गुजरता है , जिसके लिए साइन-इन की डिफ़ॉल्ट डिफ़ॉल्ट पसंद है char
। इस प्रकार इसका अपरिभाषित व्यवहार होता है । मैं इसे दोहरा रहा हूं क्योंकि मुझे उस तथ्य को शोर में डूबने के एक जानबूझकर प्रयास पर संदेह है।
std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' ');
str.erase(end_pos, str.end());
<algorithm>
काम करने के लिए इसे शामिल करना होगा।
से gamedev
string.erase(std::remove_if(string.begin(), string.end(), std::isspace), string.end());
::isspace
यूबी है।
क्या आप बूस्ट स्ट्रिंग एल्गो का उपयोग कर सकते हैं? http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/usage.html#id1290573
erase_all(str, " ");
remove_if(str.begin(), str.end(), isspace);
उल्लेखित मैट प्राइस से धीमा है । मुझे पता नहीं क्यों। वास्तव में, सभी बूस्ट सामान, जिसमें एसटीएल विकल्प होते हैं, समान gcc वाले (मेरे द्वारा परीक्षण किए गए सभी) की तुलना में धीमे होते हैं। उनमें से कुछ बेहद धीमी हैं! (unordered_map आवेषण में 5 गुना तक) हो सकता है कि यह साझा वातावरण के सीपीयू कैश के कारण या ऐसा कुछ है।
ट्रिमिंग के लिए, बूस्ट स्ट्रिंग एल्गोरिदम का उपयोग करें :
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;
// ...
string str1(" hello world! ");
trim(str1); // str1 == "hello world!"
आप इस समाधान का उपयोग चार को हटाने के लिए कर सकते हैं:
#include <algorithm>
#include <string>
using namespace std;
str.erase(remove(str.begin(), str.end(), char_to_remove), str.end());
हाय, आप ऐसा कुछ कर सकते हैं। यह फ़ंक्शन सभी रिक्त स्थान को हटा देता है।
string delSpaces(string &str)
{
str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
return str;
}
मैंने एक और फ़ंक्शन किया, जो सभी अनावश्यक रिक्त स्थान को हटा देता है।
string delUnnecessary(string &str)
{
int size = str.length();
for(int j = 0; j<=size; j++)
{
for(int i = 0; i <=j; i++)
{
if(str[i] == ' ' && str[i+1] == ' ')
{
str.erase(str.begin() + i);
}
else if(str[0]== ' ')
{
str.erase(str.begin());
}
else if(str[i] == '\0' && str[i-1]== ' ')
{
str.erase(str.end() - 1);
}
}
}
return str;
}
string replaceinString(std::string str, std::string tofind, std::string toreplace)
{
size_t position = 0;
for ( position = str.find(tofind); position != std::string::npos; position = str.find(tofind,position) )
{
str.replace(position ,1, toreplace);
}
return(str);
}
इसका इस्तेमाल करें:
string replace = replaceinString(thisstring, " ", "%20");
string replace2 = replaceinString(thisstring, " ", "-");
string replace3 = replaceinString(thisstring, " ", "+");
यदि आप इसे आसान मैक्रो के साथ करना चाहते हैं, तो यहां एक है:
#define REMOVE_SPACES(x) x.erase(std::remove(x.begin(), x.end(), ' '), x.end())
यह आपने निश्चित रूप से किया #include <string>
है।
इसे ऐसे कॉल करें:
std::string sName = " Example Name ";
REMOVE_SPACES(sName);
printf("%s",sName.c_str()); // requires #include <stdio.h>
मैंने लंबे समय तक नीचे दिए गए काम का उपयोग किया - इसकी जटिलता के बारे में निश्चित नहीं।
s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return (f==' '||s==' ');}),s.end());
जब आप हटाना चाहते हैं चरित्र ' '
और उदाहरण के लिए कुछ का -
उपयोग करें
s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return ((f==' '||s==' ')||(f=='-'||s=='-'));}),s.end());
इसी तरह ||
अगर आपके द्वारा हटाए गए पात्रों की संख्या 1 नहीं है तो बढ़ाएं
लेकिन जैसा कि दूसरों ने उल्लेख किया है कि मिटाना मुहावरे भी ठीक लगता है।
string removeSpaces(string word) {
string newWord;
for (int i = 0; i < word.length(); i++) {
if (word[i] != ' ') {
newWord += word[i];
}
}
return newWord;
}
यह कोड मूल रूप से एक स्ट्रिंग लेता है और इसमें हर चरित्र के माध्यम से पुनरावृति करता है। यह तब जांचता है कि क्या वह स्ट्रिंग एक सफेद स्थान है, यदि ऐसा नहीं है तो चरित्र को एक नए स्ट्रिंग में जोड़ा जाता है।
#include <algorithm> using namespace std; int main() { . . s.erase( remove( s.begin(), s.end(), ' ' ), s.end() ); . . }
इस मंच से लिया गया संदर्भ ।
C ++ 20 में आप फ्री फंक्शन std :: erase का उपयोग कर सकते हैं
std::string str = " Hello World !";
std::erase(str, ' ');
पूर्ण उदाहरण:
#include<string>
#include<iostream>
int main() {
std::string str = " Hello World !";
std::erase(str, ' ');
std::cout << "|" << str <<"|";
}
मैं छापता हूँ | ताकि यह स्पष्ट हो कि भीख मांगने की जगह को भी हटा दिया गया है।
नोट: यह केवल स्थान को हटाता है, हर दूसरे संभावित चरित्र को नहीं जिसे व्हाट्सएप माना जा सकता है, https://en.cppreference.com/w/cpp/string/byte/isspace देखें
सभी व्हाट्सएप पात्रों को हटाता है जैसे टैब और लाइन ब्रेक (C ++ 11):
string str = " \n AB cd \t efg\v\n";
str = regex_replace(str,regex("\\s"),"");
string str = "2C F4 32 3C B9 DE";
str.erase(remove(str.begin(),str.end(),' '),str.end());
cout << str << endl;
आउटपुट: 2CF4323CB9DE
string removespace(string str)
{
int m = str.length();
int i=0;
while(i<m)
{
while(str[i] == 32)
str.erase(i,1);
i++;
}
}
length()
रिटर्न एक size_t
, न कि एक int
। erase()
एक size_type
, एक नहीं लेता है int
। इंडेक्स हमेशा इंक्रीमेंट होने के बाद से लगातार दो स्पेस का सामना करने पर फ़ंक्शन विफल हो जाएगा। यदि एक स्थान को हटा दिया जाता है, तो लूप स्ट्रिंग की सीमा से परे पढ़ेगा। आपको शायद इस उत्तर को हटा देना चाहिए क्योंकि इसमें बहुत मदद की ज़रूरत है।
मुझे डर है कि यह सबसे अच्छा उपाय है जिसके बारे में मैं सोच सकता हूं। लेकिन आप चीजों को थोड़ा बढ़ाने के लिए पहले से आवश्यक न्यूनतम मेमोरी को आरक्षित करने के लिए आरक्षित () का उपयोग कर सकते हैं। आप एक नए तार के साथ समाप्त होंगे जो संभवतः कम होगा लेकिन वह समान मात्रा में मेमोरी लेता है, लेकिन आप वास्तविकताओं से बचेंगे।
संपादित करें: आपकी स्थिति के आधार पर, यह आसपास के पात्रों की तुलना में कम ओवरहेड को उकसा सकता है।
आपको अलग-अलग तरीकों की कोशिश करनी चाहिए और देखना चाहिए कि आपके लिए सबसे अच्छा क्या है: आपके पास कोई भी प्रदर्शन समस्या नहीं हो सकती है।