Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从向量中删除字符串<;字符串>;在向量中定义的at索引<;int>;_C++_Visual C++_Vector_Erase - Fatal编程技术网

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())i.begin()
i.end()
,或
i.rbegin()
i.rend()
分别按降序或升序排序即可进行枚举。以上所有这些都值得研究。没错<代码>标准::排序(i.begin()、i.end()、标准::greater())i.begin()
i.end()
,或
i.rbegin()
i.rend()
分别按降序或升序排序即可进行枚举。所有这些都值得研究。