সি ++ এর স্ট্রিং থেকে ফাঁকা স্থান সরিয়ে নেওয়ার পছন্দের উপায়টি কী? আমি সমস্ত চরিত্রের মধ্য দিয়ে লুপ করতে এবং একটি নতুন স্ট্রিং তৈরি করতে পারলাম, তবে এর থেকে আরও ভাল উপায় কি আছে?
সি ++ এর স্ট্রিং থেকে ফাঁকা স্থান সরিয়ে নেওয়ার পছন্দের উপায়টি কী? আমি সমস্ত চরিত্রের মধ্য দিয়ে লুপ করতে এবং একটি নতুন স্ট্রিং তৈরি করতে পারলাম, তবে এর থেকে আরও ভাল উপায় কি আছে?
উত্তর:
সবচেয়ে ভাল কাজটি হল অ্যালগরিদম remove_if
এবং ইস্পেস ব্যবহার করা :
remove_if(str.begin(), str.end(), isspace);
এখন অ্যালগরিদম নিজেই ধারকটি পরিবর্তন করতে পারে না (কেবলমাত্র মানগুলি সংশোধন করে), সুতরাং এটি প্রকৃতপক্ষে মানগুলিকে চারপাশে বদলে দেয় এবং একটি পয়েন্টারটি ফিরে আসে যেখানে শেষ হওয়া উচিত। সুতরাং কন্টেইনারটির দৈর্ঘ্যটি সংশোধন করার জন্য আমাদের স্ট্রিং :: মুছতে হবে:
str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
আমাদের এও লক্ষ্য করা উচিত যে মুছে ফেলা_আইফ ডেটার সর্বাধিক একটি অনুলিপি তৈরি করবে। এখানে একটি নমুনা বাস্তবায়ন:
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 ব্যতীত সমস্ত চরিত্রের সেটগুলির জন্য ইউবি। সি 99 .7.4 / 1। খুব খারাপ পরামর্শ হওয়া সত্ত্বেও এটি এখন অবধি votes১ টি ভোটে উন্নীত হয়েছে তা আমাকে অবাক করে দেয় না ।
isspace
কোডটি স্বাক্ষর করার প্রাক-অনুশীলন ডিফল্ট পছন্দ সহ, সমস্ত অ-এসসিআইআই অক্ষরের জন্য নেতিবাচক মানগুলি ( ইওফ থেকে পৃথক) করে char
। সুতরাং এটির অপরিবর্তিত আচরণ রয়েছে । আমি এটি পুনরাবৃত্তি করছি কারণ আমি এই সত্যটি শব্দকে ডুবিয়ে দেওয়ার ইচ্ছাকৃত প্রচেষ্টা সন্দেহ করি।
std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' ');
str.erase(end_pos, str.end());
<algorithm>
এটি কাজ করার জন্য আপনাকে অন্তর্ভুক্ত করতে হবে।
গেমদেব থেকে
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);
যে ম্যাট প্রাইজের উল্লেখ করেছে তার চেয়ে ধীর । কেন জানি না। প্রকৃতপক্ষে, সমস্ত বুস্ট স্টাফ, যেগুলির এসটিএল বিকল্প রয়েছে, সংশ্লিষ্ট জিসিসি'র চেয়ে ধীরে ধীরে (আমি পরীক্ষিত সমস্ত)। তাদের মধ্যে কিছু ধীরে ধীরে ধীরে ধীরে! (আনর্ডার্ড_ম্যাপ সন্নিবেশে 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() ); . . }
এই ফোরাম থেকে রেফারেন্স নেওয়া ।
সি ++ ২০ এ আপনি বিনামূল্যে ফাংশন এসটিডি :: মুছতে পারেন
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.cppreferences.com/w/cpp/string/byte/isspace দেখুন
ট্যাব এবং লাইন ব্রেক (সি ++ 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
। সূচক সর্বদা বর্ধিত হওয়ার কারণে টানা দুটি স্পেসের মুখোমুখি হলে ফাংশনটি সম্ভবত ব্যর্থ হবে। যদি একটি স্থান সরিয়ে ফেলা হয়, তবে লুপটি স্ট্রিংয়ের সীমানার বাইরে পড়বে। আপনার এই উত্তরটি সম্ভবত মুছে ফেলা উচিত কারণ এর জন্য প্রচুর সহায়তার প্রয়োজন।
আমি ভয় পাচ্ছি যে এটি আমার পক্ষে সবচেয়ে ভাল সমাধান। তবে আপনি কিছুটা গতি বাড়ানোর জন্য ন্যূনতম প্রয়োজনীয় মেমরিটি প্রাক-বরাদ্দ করতে রিজার্ভ () ব্যবহার করতে পারেন। আপনি একটি নতুন স্ট্রিং দিয়ে শেষ করবেন যা সম্ভবত সংক্ষিপ্ত হবে তবে এটি একই পরিমাণ মেমরি গ্রহণ করে তবে আপনি পুনরায় স্থানগুলি এড়াতে পারবেন।
সম্পাদনা: আপনার পরিস্থিতির উপর নির্ভর করে, এটি চারপাশে ঝাঁকুনির চেয়ে কম ওভারহেড নিতে পারে।
আপনার আলাদা পদ্ধতির চেষ্টা করা উচিত এবং আপনার পক্ষে ভাল কি তা দেখতে হবে: আপনার কোনও কার্য সম্পাদনের সমস্যা নাও থাকতে পারে।