2

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

4 に答える 4

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;
}
于 2012-09-17T08:47:49.867 に答える
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 );
}
于 2012-09-17T09:30:05.520 に答える
1
container.insert(std::find(container.begin(), container.end(), valueToInsertBefore), valueToInsert);
于 2012-09-17T08:46:40.810 に答える
0

この種の操作にはリストの方が適しています。挿入を使用すると、反復子とポインターが無効になるリスクがあり、メモリの再割り当ても必要になります。

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

于 2012-09-17T08:50:49.650 に答える