C++ 访问向量元素时索引越界异常 #包括 #包括 #包括 使用名称空间std; int main() { int t; cin>>t; 而(t--) {向量a,b; int i,n,m,k; bool cond=真; cin>>n; 对于(i=0;i>m; a、 推回(m); } 对于(i=1;i

C++ 访问向量元素时索引越界异常 #包括 #包括 #包括 使用名称空间std; int main() { int t; cin>>t; 而(t--) {向量a,b; int i,n,m,k; bool cond=真; cin>>n; 对于(i=0;i>m; a、 推回(m); } 对于(i=1;i,c++,C++,您正在访问越界,因为在删除元素后,您的容器现在比您的迭代次数短一个元素 在任何情况下,只要使用标准库中已有的内容,就可以用两行代码解决问题: #include <iostream> #include<algorithm> #include<vector> using namespace std; int main() { int t; cin>>t; while(t--) { vector <int

您正在访问越界,因为在删除元素后,您的容器现在比您的迭代次数短一个元素

在任何情况下,只要使用标准库中已有的内容,就可以用两行代码解决问题:

#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;


    int main()
{
    int t;
    cin>>t;
    while(t--)
    { vector <int> a,b;
      int i,n,m,k;
      bool cond=true;
     cin>>n;
     for(i=0;i<n;i++)
     {
         cin>>m;
         a.push_back(m);
     }
     for(i=1;i<n-1;i++)
     {
         if(a.at(i)==a.at(i+1))
            a.erase(a.begin()+i);
     }
     n=a.size();
     for(i=0;i<n;i++)
        cout<<a[i];

    }
    return 0;
}

另请参见:

(i=1;当以“朴素的方式”删除元素时,我总是向后迭代,它仍然是O(n^2),但至少可以避免“移动索引”。(也就是说,正确的解决方案是O(n),使用经典的“读指针/写指针”循环,或者更简单地说,使用
std::remove
及其相关项)从vector构造一个集合,然后将数据分配回vector。一个好的调试器可能非常有助于发现这里的问题…您尝试过吗?
auto last = std::unique(a.begin(), a.end());
a.erase(last, a.end());