我是 STL 的新手,正在尝试一个简单的程序来使用 push_back 插入元素并尝试删除甚至索引的元素。
我取了 n 个元素并将其推入向量中。但是当我删除它时,我要么得到分段错误,要么得到一些不希望的输出。
for(i=0;i<n;++i)
{
if(i%2==0)
v.erase(v.begin()+i);
}
如果我使用 n-1 而不是 n 它可以工作,但不会提供所需的输出。
我是 STL 的新手,正在尝试一个简单的程序来使用 push_back 插入元素并尝试删除甚至索引的元素。
我取了 n 个元素并将其推入向量中。但是当我删除它时,我要么得到分段错误,要么得到一些不希望的输出。
for(i=0;i<n;++i)
{
if(i%2==0)
v.erase(v.begin()+i);
}
如果我使用 n-1 而不是 n 它可以工作,但不会提供所需的输出。
请记住计数,只需在擦除后将 itr 初始化为正确的位置,相同的 itr 指向向量中的下一个未删除元素
vector<int> vec = { 1,2,3,4,5,6,7,8,9,10};
int main()
{
auto itr=vec.begin();
while( itr != vec.end() ){
itr++;
vec.erase(itr);
}
for(auto data : vec) cout << " " << data << " " ;
cout << endl;
}
只是为了招待您的解决方案
void EraseEveryOdd(std::vector<int>& v) {
if ((v.size() % 2) > 0)
v.pop_back();
auto size = v.size() / 2;
for (size_t i = 0; i < size; ++i)
v.erase(v.begin() + i);
}
void EraseEveryEven(std::vector<int>& v) {
if ((v.size() % 2) == 0)
v.pop_back();
auto size = (v.size() / 2) + 1;
for (size_t i = 1; i < size; ++i)
v.erase(v.begin() + i);
}
你可以这样做
for(i=n-1;i<=0;i--)
正如评论中提到的,删除向量的元素会减小向量的大小。通过更改 for 循环条件,您将开始从向量末尾删除偶数索引。这样,向量大小的变化就不会产生问题。
通过始终删除带有 的元素erase
,您的函数将具有 O(n²) 运行时。更好的选择是首先压缩元素,然后才擦除其余元素之后的所有元素:
#include <utility>
#include <vector>
void remove_odd_indices(std::vector<int> & inout)
{
auto write = inout.begin();
auto read = inout.begin();
for(auto n = inout.size(), i = 0 * n; i < n; ++i, ++read)
{
if(i % 2 == 0)
continue;
*write++ = std::move_if_noexcept(*read);
}
inout.erase(write, inout.end());
}