从vector <int>中定义的索引处的vector <string>中删除字符串

时间:2017-02-26 18:46:09

标签: 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 (int n = 0; n < i.size(); ++n)
    {
        s.erase(s.begin() + i[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]);
}

正如你所看到的,我只是做了另一个反向的循环。

2 个答案:

答案 0 :(得分:3)

这种方法的问题是,一旦i[n]的项目被删除,其背后的所有索引都会向后移一。

为了使该程序正常工作,请对i进行排序,并从最大到最小进行迭代。

答案 1 :(得分:0)

正如已经指出的那样,崩溃的原因是索引失效 - 删除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());

如果您能够代表要删除特定值的元素,例如一个空字符串,它变得更好:

for(int index : i)
    s[index] = "";
s.erase(std::remove(s.begin(),s.end(),""),s.end());