在 c++ 中按向量 <string> 中的位置删除元素
remove element by position in a vector<string> in c++
我一直在尝试从包含以下内容的 vector<string> plan;
中删除值 False
和 0;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]
位置,谢谢寻求任何帮助。
[注意:此答案假设每一行对应向量中的一个元素]
同声明
remove(plan.begin(), plan.end(), "False");
您尝试删除 向量 中等于 "False"
.
的所有元素
您需要遍历向量并从向量中的每个字符串中删除 sub-string。
例如,您可以使用 range for
loop to iterate over all the strings (or rather references to them), and then use the std::string
functions find
to find the sub-strings you want to remove and replace
将 sub-string 替换为空字符串(即什么都没有)。
如果你确定在你的向量中只出现了一次 "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");
}
};
但是,如果您认为这些 sub-strings 可能出现很多次,您应该像这样改进您的 sub-string 删除机制:
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());
});
}
[注:假设1003;2021-03-09;False;0;0;1678721F
对应std::vector<string>
]
里面的一行
std::remove :从向量中删除单个元素(位置)或一系列元素([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
的每一行中删除 given sub-string。您需要遍历所有行以使用 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找到一个sub-string并删除它。
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<string> plan;
中删除值 False
和 0;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]
位置,谢谢寻求任何帮助。
[注意:此答案假设每一行对应向量中的一个元素]
同声明
remove(plan.begin(), plan.end(), "False");
您尝试删除 向量 中等于 "False"
.
您需要遍历向量并从向量中的每个字符串中删除 sub-string。
例如,您可以使用 range for
loop to iterate over all the strings (or rather references to them), and then use the std::string
functions find
to find the sub-strings you want to remove and replace
将 sub-string 替换为空字符串(即什么都没有)。
如果你确定在你的向量中只出现了一次 "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");
}
};
但是,如果您认为这些 sub-strings 可能出现很多次,您应该像这样改进您的 sub-string 删除机制:
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());
});
}
[注:假设1003;2021-03-09;False;0;0;1678721F
对应std::vector<string>
]
std::remove :从向量中删除单个元素(位置)或一系列元素([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
的每一行中删除 given sub-string。您需要遍历所有行以使用 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找到一个sub-string并删除它。
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;
}