วิธีที่แนะนำในการลบช่องว่างออกจากสตริงใน C ++ คืออะไร ฉันสามารถวนรอบตัวละครทั้งหมดและสร้างสายอักขระใหม่ แต่มีวิธีที่ดีกว่า
วิธีที่แนะนำในการลบช่องว่างออกจากสตริงใน C ++ คืออะไร ฉันสามารถวนรอบตัวละครทั้งหมดและสร้างสายอักขระใหม่ แต่มีวิธีที่ดีกว่า
คำตอบ:
สิ่งที่ดีที่สุดที่ต้องทำคือใช้อัลกอริทึมremove_if
และ isspace:
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
คือ UB สำหรับชุดอักขระทั้งหมดยกเว้น ASCII 7 บิตดั้งเดิม C99 §7.4 / 1 มันไม่แปลกใจฉันว่าจะได้รับการปรับแต่ง upvoted 71 คะแนนเสียงโดยขณะนี้แม้จะแนะนำที่ดีมาก
isspace
สำหรับทุกอักขระที่ไม่ใช่ ASCII กับตัวเลือกเริ่มต้นในการปฏิบัติของ signedness 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
เป็น UB
คุณสามารถใช้ Boost String Algo ได้ไหม? 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);
ราคาที่แมตต์กล่าวไว้ ฉันไม่รู้ว่าทำไม ที่จริงแล้วทุกสิ่งที่เพิ่มที่มีทางเลือก STL ช้ากว่า gcc ที่เกี่ยวข้อง (ทุกสิ่งที่ฉันทดสอบ) บางส่วนของพวกเขาช้าลงอย่างมาก! (มากถึง 5 ครั้งในส่วนแทรก unordered_map) อาจเป็นเพราะแคช CPU ของสภาพแวดล้อมที่ใช้ร่วมกันหรือบางสิ่งบางอย่างเช่นนั้น
สำหรับการตัดแต่งใช้อัลกอริธึมสตริง Boost :
#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
ฉันกลัวว่ามันเป็นทางออกที่ดีที่สุดที่ฉันสามารถนึกได้ แต่คุณสามารถใช้การสำรอง () เพื่อจัดสรรหน่วยความจำขั้นต่ำที่ต้องการล่วงหน้าล่วงหน้าเพื่อเร่งความเร็วของสิ่งต่างๆ คุณจะพบกับสตริงใหม่ที่อาจสั้นลง แต่ใช้จำนวนหน่วยความจำเท่ากัน แต่คุณจะไม่ต้องจัดสรรใหม่
แก้ไข: ขึ้นอยู่กับสถานการณ์ของคุณนี้อาจมีค่าใช้จ่ายน้อยกว่าตัวอักษร jumbling รอบ ๆ
คุณควรลองแนวทางที่แตกต่างและดูว่าอะไรดีที่สุดสำหรับคุณ: คุณอาจไม่มีปัญหาด้านประสิทธิภาพเลย