这就是我可能会做的:
typedef ::std::vector<int> MyList;
typedef MyList::iterator MyListIter;
MyList data;
// ... fill data ...
const int searchValue = 2;
const int addValue = 3;
// Find first occurence of searched value
MyListIter iter = ::std::find(data.begin(), data.end(), searchValue);
while(iter != data.end())
{
// We want to add our value after searched one
++iter;
// Insert value and return iterator pointing to the inserted position
// (original iterator is invalid now).
iter = data.insert(iter, addValue);
// This is needed only if we want to be sure that out value won't be used
// - for example if searchValue == addValue is true, code would create
// infinite loop.
++iter;
// Search for next value.
iter = ::std::find(iter, data.end(), searchValue);
}
但正如你所看到的,我无法避免你提到的增量。但我认为这不是坏事:我会将这段代码放在单独的函数中(可能在某种“核心/实用程序”模块中)并且 - 当然 - 将此函数实现为模板,所以我只会编写它一次 - 恕我直言,只有一次担心增加价值是可以接受的。非常可以接受。
template <class ValueType>
void insertAfter(::std::vector<ValueType> &io_data,
const ValueType &i_searchValue,
const ValueType &i_insertAfterValue);
甚至更好(恕我直言)
template <class ListType, class ValueType>
void insertAfter(ListType &io_data,
const ValueType &i_searchValue,
const ValueType &i_insertAfterValue);
编辑:
好吧,我会以不同的方式解决问题:首先计算搜索值出现的次数(最好存储在某种可以保存和重复使用的缓存中),这样我就可以在之前准备数组(只有一个分配)并使用 memcpy 移动原始值(当然,仅适用于 int 等类型)或 memmove(如果向量分配的大小已经足够)。