C++ 从向量中删除字符串<;字符串>;在向量中定义的at索引<;int>;
我想删除基于整数向量索引的字符串向量的项 循环崩溃了,尽管我可以很好地编译代码C++ 从向量中删除字符串<;字符串>;在向量中定义的at索引<;int>;,c++,visual-c++,vector,erase,C++,Visual C++,Vector,Erase,我想删除基于整数向量索引的字符串向量的项 循环崩溃了,尽管我可以很好地编译代码 #include <vector> #include <string> using std::string; using std::vector; int main() { vector<string> s = { "foo", "bar", "random_word" }; vector<int> i = { 0, 1 }; for (in
#include <vector>
#include <string>
using std::string;
using std::vector;
int main()
{
vector<string> s = { "foo", "bar", "random_word" };
vector<int> i = { 0, 1 };
for (int n = 0; n < i.size(); ++n)
{
s.erase(s.begin() + i[n]);
}
}
#包括
#包括
使用std::string;
使用std::vector;
int main()
{
向量s={“foo”,“bar”,“random_word”};
向量i={0,1};
对于(int n=0;n
编辑:这是导致问题的实际代码:
// The vector in which the elements to be deleted are defined consists of
// { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }.
//The identifier is i.
// The other vector consists of
// { "Bancheri", "Bertagna", "Buzzoni", "Canepa", "De Vita", "Di Bella",
// "Drago", "Esposito", "Fossati", "Francini", "Frontini", "Lorenzi",
// "Marusceac", "Miscio", "Padovani", "Scarfo'", "Sieni", "Thea Cioni",
// "Zunino" } and its identifier is s.
for (int p = 0; p < i.size(); ++p)
{
s.erase(s.begin() + s[i])
}
// This is how I fixed it:
for (int r = i.size() - 1; r > 0; --r)
{
s.erase(s.begin() + i[r]);
}
//定义要删除的元素的向量包括
// { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }.
//标识符是i。
//另一个向量包括
//{“班切里”、“贝塔尼亚”、“布佐尼”、“卡内帕”、“德维塔”、“迪贝拉”,
//“德拉戈”、“埃斯波西托”、“福萨蒂”、“弗朗西尼”、“弗朗蒂尼”、“洛伦兹”,
//“Marusceac”、“Miscio”、“Padovani”、“Scarfo”、“Sieni”、“Thea Cioni”,
//“Zunino”},其标识符为s。
对于(int p=0;p0;--r)
{
s、 擦除(s.begin()+i[r]);
}
正如你所看到的,我只是做了一个相反的循环。这种方法的问题是,一旦
I[n]
中的一个项目被删除,它后面的所有索引都会向后移动一个
为了让这个程序工作,对
i
进行排序,并从最大值到最小值进行迭代。这种方法的问题是,一旦i[n]
中的一个项目被删除,它后面的所有索引都会向后移动一个
为了使该程序工作,对
i
进行排序,并从最大值到最小值进行迭代。如前所述,崩溃的原因是索引无效-删除i[n]
的第个元素后,所有大于i[n]
的索引都必须递减1
通过按降序遍历索引容器,可以确保在任何时候都没有大于i[n]
的索引,因此不需要调整其他索引,因此排序i
确实解决了问题
然而,由于std::vector是一个连续的数组,所以逐个擦除元素通常不是一个好主意。在您的情况下,重新排列代码以一次性完成所有擦除操作相当容易:
std::sort(i.begin(),i.end());
i.push_back(s.size()); //just to make sure the whole vector is visited
auto iter = s.begin();
int current_index = 0;
for(int index : i)
{
while(current_index < index)
{
*(iter++) = s[current_index++];
}
current_index++;
}
s.erase(iter, s.end());
正如已经指出的,崩溃的原因是索引无效-所有大于
i[n]
的索引必须在删除i[n]
的第个元素后减1
通过按降序遍历索引容器,可以确保在任何时候都没有大于i[n]
的索引,因此不需要调整其他索引,因此排序i
确实解决了问题
然而,由于std::vector是一个连续的数组,所以逐个擦除元素通常不是一个好主意。在您的情况下,重新排列代码以一次性完成所有擦除操作相当容易:
std::sort(i.begin(),i.end());
i.push_back(s.size()); //just to make sure the whole vector is visited
auto iter = s.begin();
int current_index = 0;
for(int index : i)
{
while(current_index < index)
{
*(iter++) = s[current_index++];
}
current_index++;
}
s.erase(iter, s.end());
您应该从较大的索引中删除到较低的索引。@Rakete1111是的,现在修复了它。您不初始化
n
?请注意,在s[0]
被擦除之前,索引1
处的字符串与之后索引1
处的字符串不同。您希望删除哪一个?用于(int n;n
-无法保证n
将自动设置为0
。您应该为(int n=0;n
。请注意第一条语句中的初始化。您应该从较大的索引中删除到较低的索引。@Rakete1111是的,现在修复了它。您不初始化n
?请注意,擦除s[0]
之前索引1
处的字符串与之后索引1
处的字符串不同。您希望删除哪一个?用于(int n;n
-无法保证n
将自动设置为0
。您应该为(int n=0;n
。请注意第一条语句中的初始化<代码>标准::排序(i.begin()、i.end()、标准::greater())在进入循环之前,@WhozCraig我不知道那是什么代码means@TommasoTheaCioni它按降序对容器进行排序。@TommasoTheaCioni如果尚未排序,则将按降序(从大到小)排序。如果您知道它已经排序(升序或降序),则不必这样做。只需通过迭代器使用i.begin()
和i.end()
,或i.rbegin()
和i.rend()
分别按降序或升序排序即可进行枚举。以上所有这些都值得研究。没错<代码>标准::排序(i.begin()、i.end()、标准::greater())在进入循环之前,@WhozCraig我不知道那是什么代码means@TommasoTheaCioni它按降序对容器进行排序。@TommasoTheaCioni如果尚未排序,则将按降序(从大到小)排序。如果您知道它已经排序(升序或降序),则不必这样做。只需通过迭代器使用i.begin()
和i.end()
,或i.rbegin()
和i.rend()
分别按降序或升序排序即可进行枚举。所有这些都值得研究。