在 C++ 中按向量中的位置删除元素<string>



我一直试图从包含以下内容的vector<string> plan;中删除值False0;0

1003;2021-03-09;False;0;0;1678721F
1005;2021-03-05;False;0;0;1592221D
1005;2021-03-06;False;0;0;1592221D
1003;2021-03-07;False;0;0;1592221D
1003;2021-03-08;False;0;0;1592221D
1004;2021-03-09;False;0;0;1592221D
1004;2021-03-10;False;0;0;1592221D
1001;2021-03-11;False;0;0;1592221D

,但我找到的解决方案只适用于int,我尝试了以下

remove(plan.begin(), plan.end(), "False");

也适用于erase,但不适用

我所犯的错误是什么,或者我应该如何消除我想要的值,这是在位置[2][3][4],感谢任何帮助。

[注释]:假设1003;2021-03-09;False;0;0;1678721F对应std::vector<string>中的一行]


std::remove:从vector对象中移除单个元素(position)或一段元素([first, last))。

如果std::vector<string> plan包含值False,则将其删除。

std::vector < std::string > plan =
{
"1003","2021-03-09","False","0;0","1678721F"

};

std::remove(plan.begin(),plan.end(),"False");

在您的情况下,您需要从plan的每一行删除给定的子字符串。您需要遍历所有行以使用std::string::erase删除给定值。

std::vector < std::string > plan =
{
"1003;2021-03-09;False;0;0;1678721F",
"1005;2021-03-05;False;0;0;1592221D",
"1005;2021-03-06;False;0;0;1592221D",
"1003;2021-03-07;False;0;0;1592221D",
"1003;2021-03-08;False;0;0;1592221D",
"1004;2021-03-09;False;0;0;1592221D",
"1004;2021-03-10;False;0;0;1592221D",
"1001;2021-03-11;False;0;0;1592221D"};
for (auto & e:plan)
{
//As position of False;0;0; is at a fixed index, i.e: from index:16, 10 characters are removed
e.erase (16, 10);
}

一般来说,您可以使用std::String::find来查找子字符串并擦除它。

void removeSubstrs(string& s, string p) { 
string::size_type n = p.length();
for (string::size_type i = s.find(p);
i != string::npos;
i = s.find(p))
s.erase(i, n);
}
int
main ()
{
std::vector < std::string > plan =
{
"1003;2021-03-09;False;0;0;1678721F",
"1005;2021-03-05;False;0;0;1592221D",
"1005;2021-03-06;False;0;0;1592221D",
"1003;2021-03-07;False;0;0;1592221D",
"1003;2021-03-08;False;0;0;1592221D",
"1004;2021-03-09;False;0;0;1592221D",
"1004;2021-03-10;False;0;0;1592221D",
"1001;2021-03-11;False;0;0;1592221D"};
for (auto & e:plan)
{
removeSubstrs (e, ";False;0;0");
}

for (auto e:plan)
std::cout << e << std::endl;

return 0;
}

[注:此答案假设每行对应vector中的一个元素]

和语句

remove(plan.begin(), plan.end(), "False");

尝试从向量中删除所有等于"False"的元素。

需要遍历vector,并从vector中的每个字符串中擦除子字符串。

例如,您可以使用范围for循环遍历所有字符串(或者更确切地说引用到它们),然后使用std::string函数find找到您想要删除的子字符串,replace将子字符串替换为空字符串(即无)。

如果您确定在vector中只有一次出现"First""0;0",您可以使用如下内容:

std::string EraseFirstSubString(
const std::string & main_str,
const std::string & sub_str)
{
std::string new_main_str = main_str;
size_t pos = new_main_str.find(sub_str);
if (pos != std::string::npos)
{
new_main_str.erase(pos, sub_str.length());
}
return new_main_str;
}
int main()
{
std::vector<std::string> plan = {
"1003;2021-03-09;False;0;0;1678721F",
"1005;2021-03-05;False;0;0;1592221D",
"1005;2021-03-06;False;0;0;1592221D",
"1003;2021-03-07;False;0;0;1592221D",
"1003;2021-03-08;False;0;0;1592221D",
"1004;2021-03-09;False;0;0;1592221D",
"1004;2021-03-10;False;0;0;1592221D",
"1001;2021-03-11;False;0;0;1592221D" 
};
for (std::string & str : plan)
{
str = EraseFirstSubString(str, "False");
str = EraseFirstSubString(str, "0;0");
}
};

但是,如果你认为这些子字符串可能会出现很多次,你应该稍微改进一下子字符串删除机制,像这样:

std::string EaraseSubStrings(
const std::string & main_str, 
const std::string & sub_str)
{
std::string new_main_str = main_str;
size_t pos = new_main_str.find(sub_str);
while (pos != std::string::npos)
{
new_main_str.erase(pos, sub_str.length());
pos = new_main_str.find(sub_str);
}
return new_main_str;
}

如果你已经有了一个单独的std::string对象的向量,你可以很容易地使用字符串库提供的操作。

#include <algorithm>
#include <vector>
#include <string>
// before C++20 change constexpr to inline
constexpr void change(std::vector<std::string>& sv, std::string const& rem) {
for_each(beign(sv),end(sv), [&rem](std::string& s) {
s.erase(std::min(s.size(),s.find(rem)), rem.size());
});
}

相关内容

最新更新