在特定值的元素之前在std :: vector中插入元素

时间:2012-09-17 08:44:32

标签: c++

你能建议一个更好的方法在std :: vector中的另一个值之前插入一个值:

template<class T>
void insert(std::vector<T>& container, const T& valueToInsertBefore, const T& valueToInsert)
{
    std::vector<T>::iterator i = container.begin();
    std::vector<T>::iterator end = container.end();
    for(;i!=end;++i)
    {
        if(*i==valueToInsertBefore)
        {
            i = container.insert(i, valueToInsert); 
            i++;                                
            end = container.end();                  
        }
    }

}

更新

应为在std :: vector中找到的valueToInsertBefore的每个实例插入。

4 个答案:

答案 0 :(得分:4)

使用std::find()来定位值而不是显式循环:

std::vector<T>::iterator i = v.begin();
while (v.end() != (i = std::find(i, v.end(), valueToInsertBefore)))
{
    // insert() returns an iterator to the inserted element.
    // The '+ 2' moves past it and the searched for element.
    //
    i = v.insert(i, valueToInsert) + 2;
}

答案 1 :(得分:2)

std::vector可能会因为需要重新分配而变得相当低效,以防它相当大并且/或者之前插入的元素经常出现。使用这样的副本的更简单的方法可能会变得更加CPU兼容(以需要更多内存为代价):

template<class T>
void insert(std::vector<T>& container,
            const T& valueToInsertBefore,
            const T& valueToInsert)
{
    std::vector<T> result;
    result.reserve( container.size() );

    std::vector<T>::const_iterator it, end = container.end();
    for ( it = container.begin(); it != end; ++it ) {
        if ( *it == valueToInsertBefore ) {
            result.push_back( valueToInsert );
        }
        result.push_back( *it );
    }

    container.swap( result );
}

答案 2 :(得分:1)

container.insert(std::find(container.begin(), container.end(), valueToInsertBefore), valueToInsert);

答案 3 :(得分:0)

您最好更改容器,列表更适合此类操作。使用插入,您可能会使迭代器和指针无效,并且还需要重新分配内存。

http://www.cplusplus.com/reference/stl/vector/insert/