Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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++ 如何从std::vector<;中删除元素&燃气轮机;按索引?_C++_Stl_Vector_Erase - Fatal编程技术网

C++ 如何从std::vector<;中删除元素&燃气轮机;按索引?

C++ 如何从std::vector<;中删除元素&燃气轮机;按索引?,c++,stl,vector,erase,C++,Stl,Vector,Erase,我有一个std::vector,我想删除第n个元素。我该怎么做 std::vector<int> vec; vec.push_back(6); vec.push_back(-17); vec.push_back(12); vec.erase(???); std::向量向量向量机; 向量推回(6); 向量推回(-17); 向量推回(12); 向量擦除(??); 要删除单个元素,可以执行以下操作: std::vector<int> vec; vec.push_back

我有一个std::vector,我想删除第n个元素。我该怎么做

std::vector<int> vec;

vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);

vec.erase(???);
std::向量向量向量机;
向量推回(6);
向量推回(-17);
向量推回(12);
向量擦除(??);

要删除单个元素,可以执行以下操作:

std::vector<int> vec;

vec.push_back(6);
vec.push_back(-17);
vec.push_back(12);

// Deletes the second element (vec[1])
vec.erase(std::next(vec.begin()));

std::vector上的擦除方法重载,因此调用

vec.erase(vec.begin() + index);
当您只想擦除单个元素时。

模板
template <typename T>
void remove(std::vector<T>& vec, size_t pos)
{
    std::vector<T>::iterator it = vec.begin();
    std::advance(it, pos);
    vec.erase(it);
}
消除空洞(标准::矢量和矢量,尺寸位置) { std::vector::iterator it=vec.begin(); 标准:预付款(it、pos); 删除(它); }
擦除方法将以两种方式使用:

  • 擦除单个元素:

    vector.erase( vector.begin() + 3 ); // Deleting the fourth element
    
  • 删除元素的范围:

    vector.erase( vector.begin() + 3, vector.begin() + 5 ); // Deleting from fourth element to sixth element
    

  • 如果您使用大向量(大小>100000)并希望删除大量元素,我建议您执行以下操作:

    int main(int argc, char** argv) {
    
        vector <int> vec;
        vector <int> vec2;
    
        for (int i = 0; i < 20000000; i++){
            vec.push_back(i);}
    
        for (int i = 0; i < vec.size(); i++)
        {
            if(vec.at(i) %3 != 0)
                vec2.push_back(i);
        }
    
        vec = vec2;
        cout << vec.size() << endl;
    }
    

    实际上,
    擦除
    功能适用于两种配置文件:

    • 删除单个元素

      iterator erase (iterator position);
      
    • 删除一系列元素

      iterator erase (iterator first, iterator last);
      
    由于std::vec.begin()标记容器的开始,如果要删除向量中的第i个元素,可以使用:

    vec.erase(vec.begin() + index);
    
    如果仔细观察,vec.begin()只是指向向量起始位置的指针,向它添加i值会增加指向i位置的指针,因此我们可以通过以下方式访问指向第i个元素的指针:

    &vec[i]
    
    所以我们可以写:

    vec.erase(&vec[i]); // To delete the ith element
    

    要删除图元,请使用以下方法:

    // declaring and assigning array1 
    std:vector<int> array1 {0,2,3,4};
    
    // erasing the value in the array
    array1.erase(array1.begin()+n);
    
    //声明和分配数组1
    std:向量数组1{0,2,3,4};
    //擦除数组中的值
    array1.erase(array1.begin()+n);
    

    有关更广泛的概述您可以访问:

    前面的答案假设您总是有一个带符号的索引。遗憾的是,
    std::vector
    使用
    size\u-type
    进行索引,而
    difference\u-type
    进行迭代器运算,因此如果启用了“-Wconversion”和friends,它们就不能一起工作。这是回答问题的另一种方式,同时能够处理签名和未签名:

    删除:

    template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type>
    void remove(std::vector<T> &v, I index)
    {
        const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index);
        v.erase(iter);
    }
    
    模板
    无效删除(标准::向量&v,I索引)
    {
    const auto&iter=v.cbegin()+gsl::窄带投射(索引);
    v、 擦除(iter);
    }
    
    采取:

    template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type>
    T take(std::vector<T> &v, I index)
    {
        const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index);
    
        auto val = *iter;
        v.erase(iter);
    
        return val;
    }
    
    模板
    T取值(标准::向量&v,I索引)
    {
    const auto&iter=v.cbegin()+gsl::窄带投射(索引);
    自动val=*iter;
    v、 擦除(iter);
    返回val;
    }
    
    如果你有一个无序向量,你可以利用它无序的事实,使用我在CPPCON从Dan Higgins那里看到的东西

    template< typename TContainer >
    static bool EraseFromUnorderedByIndex( TContainer& inContainer, size_t inIndex )
    {
        if ( inIndex < inContainer.size() )
        {
            if ( inIndex != inContainer.size() - 1 )
                inContainer[inIndex] = inContainer.back();
            inContainer.pop_back();
            return true;
        }
        return false;
    }
    
    模板
    从无序索引中删除静态布尔值(容器和容器,索引中的大小)
    {
    如果(inIndex

    由于列表顺序无关紧要,只需将列表中的最后一个元素复制到要删除的项目顶部,然后弹出并删除最后一个项目。

    这里还有一种方法,如果要通过在vector中查找该元素的值来删除该元素,只需在vector中执行此操作

    vector<int> ar(n);
    ar.erase(remove(ar.begin(), ar.end()), (place your value here from vector array));
    
    向量ar(n);
    ar.erase(删除(ar.begin(),ar.end()),(将向量数组中的值放在这里);
    
    它将从这里删除您的价值。 感谢您以最快的方式(对于按时间复杂度()=常数进行编程竞赛)

    可在1秒内擦除100米项目

        vector<int> it = (vector<int>::iterator) &vec[pos];
        vec.erase(it);
    
    
    vector it=(vector::iterator)&vec[pos];
    删除(它);
    
    最具可读性的方式:
    vec.erase(vec.begin()+pos);
    

    这个怎么样

    void squeeze(vector<int> &v)
    {
        int j = 0;
        for (int i = 1; i < v.size(); i++)
            if (v[i] != v[j] && ++j != i)
                v[j] = v[i];
        v.resize(j + 1);
    }
    
    void压缩(矢量和v)
    {
    int j=0;
    对于(int i=1;i
    我建议你读一下这篇文章,因为我相信这就是你想要的

    例如,如果您使用

     vec.erase(vec.begin() + 1, vec.begin() + 3);
    
    您将擦除向量的第n个元素,但当您擦除第二个元素时,向量的所有其他元素都将移位,向量大小将为-1。由于vector size()正在减小,如果循环遍历vector,这可能是个问题。如果你有这样的问题,建议在标准C++库中使用现有的算法。以及“移除”或“移除”


    希望这会有所帮助

    对某些人来说,这似乎是显而易见的,但要详细说明上述答案:

    如果在整个向量上循环使用
    erase
    删除
    std::vector
    元素,则应以相反顺序处理向量,即使用

    for(int i=v.size()-1;i>=0;i--)

    代替(古典)

    for(inti=0;i

    原因是索引受
    erase
    的影响,因此如果删除第4个元素,则前5个元素现在是新的第4个元素,如果执行
    i++
    ,则循环不会处理它

    下面是一个简单的例子来说明这一点,我想删除一个int向量的所有赔率元素

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void printVector(const vector<int> &v)
    {
        for (size_t i = 0; i < v.size(); i++)
        {
            cout << v[i] << " ";
        }
        cout << endl;
    }
    
    int main()
    {    
        vector<int> v1, v2;
        for (int i = 0; i < 10; i++)
        {
            v1.push_back(i);
            v2.push_back(i);
        }
    
        // print v1
        cout << "v1: " << endl;
        printVector(v1);
        
        cout << endl;
        
        // print v2
        cout << "v2: " << endl;
        printVector(v2);
        
        // Erase all odd elements
        cout << "--- Erase odd elements ---" << endl;
        
        // loop with decreasing indices
        cout << "Process v2 with decreasing indices: " << endl;
        for (int i = v2.size() - 1; i >= 0; i--)
        {
            if (v2[i] % 2 != 0)
            {
                cout << "# ";
                v2.erase(v2.begin() + i);
            }
            else
            {
                cout << v2[i] << " ";
            }
        }
        cout << endl;
        cout << endl;
        
        // loop with increasing indices
        cout << "Process v1 with increasing indices: " << endl;
        for (int i = 0; i < v1.size(); i++)
        {
            if (v1[i] % 2 != 0)
            {
                cout << "# ";
                v1.erase(v1.begin() + i);
            }
            else
            {
                cout << v1[i] << " ";
            }
        }
        
        
        return 0;
    }
    

    请注意,在索引增加的第二个版本上,由于
    i++

    删除索引为的元素,因此不会显示偶数,因为它们被跳过:

    vec.erase(vec.begin() + index);
    
    删除具有以下值的元素:

    vec.erase(find(vec.begin(),vec.end(),value));
    

    如果需要删除for循环内的元素,请执行以下操作:

    for(int i = 0; i < vec.size(); i++){
    
        if(condition)
            vec.erase(vec.begin() + i);
    
    }
    
    for(int i=0;i考虑使用STD::DeQE,它可以在两端插入和删除。不,不要考虑使用DEQE,因为您可能想要删除一个元素,这真是一个很差的建议。有一大堆的理由可以解释为什么你要使用deque或vector。的确,从向量中删除一个元素可能代价高昂——特别是如果向量很大,但没有理由认为
    
    vec.erase(vec.begin() + index);
    
    vec.erase(find(vec.begin(),vec.end(),value));
    
    for(int i = 0; i < vec.size(); i++){
    
        if(condition)
            vec.erase(vec.begin() + i);
    
    }