你能建议一个更好的方法在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的每个实例插入。
答案 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)
您最好更改容器,列表更适合此类操作。使用插入,您可能会使迭代器和指针无效,并且还需要重新分配内存。