如何有效地将一系列项目插入中间的 std::d eque 中,带有 C++03
How can I efficiently insert a series of items into the middle std::deque with C++03?
我正在使用 C++03 将整数序列插入到std::deque<int>
中。 我看到将一次插入deque
的唯一方法是使用采用位置、计数和值的重载,或者使用位置、开始输入迭代器和结束输入迭代器。 如果我可以使用后者,我会这样做:
#include <deque>
#include <boost/iterator/counting_iterator.hpp>
void
insertRecent(const int begin,
const int end, // Assumes end >= begin
std::deque<int> &_recent,
std::deque<int>::iterator insertionPoint)
{
_recent.insert(insertionPoint,
boost::counting_iterator<int>(begin),
boost::counting_iterator<int>(end));
}
但是,该boost::counting_iterator
并非在我使用的所有平台上都可用,并且在某些平台上,编译器会遇到错误。 因此,我正在尝试使用第一次重载执行此操作,如下所示,但想知道是否有更有效的方法可以做到这一点:
#include <deque>
void
insertRecent(const int begin,
const int end, // Assumes end >= begin
std::deque<int> &_recent,
std::deque<int>::iterator insertionPoint)
{
if (begin != end) {
int offset = begin;
const size_type count = static_cast<size_type>(end - begin);
const size_type insertEndDistance = _recent.end() - insertionPoint;
// Make space for all the items being inserted.
_recent.insert(insertionPoint, count, begin);
// Start off at the iterator position of the first item just inserted.
// In C++11 we can just use the return value from deque::insert().
std::deque<int>::iterator itr = _recent.end() - (count + insertEndDistance);
for (; ++offset != end; ) {
*++itr = offset;
}
}
}
我相信这种方法在(end - begin)
范围内是线性的,在与(_recent.end() - insertionPoint)
的距离上是线性的。 我是否正确认为这是我在这里所能做的好事?
您可以创建自己的计数迭代器:
class my_int_iterator {
int v_;
public:
my_int_iterator (int v = 0) : v_(v) {}
int operator * () const { return v_; }
my_int_iterator & operator ++ () { ++v_; return *this; }
bool operator != (my_int_iterator mii) const { return v_ != mii.v_; }
typedef std::input_iterator_tag iterator_category;
typedef int value_type;
typedef void difference_type;
typedef void pointer;
typedef void reference;
};
void
insertRecent(const int begin,
const int end, // Assumes end >= begin
std::deque<int> &_recent,
std::deque<int>::iterator insertionPoint)
{
_recent.insert(insertionPoint,
my_int_iterator(begin),
my_int_iterator(end));
}
相关文章:
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 为C++03编译器编写部分unique_ptr,该编译器与较新的编译器在公共代码库上运行
- Boost 绑定和"result_type":不是成员,对 c++03 友好
- 了解 printf 格式规范中的 %03.3u
- 如何在C++03中用自定义谓词调用std::unique
- 如何在没有外部库的情况下使用C++03约束执行基于正则表达式的字符串操作
- 是否可以在 C++03 中实现类似"覆盖"的功能
- C++03 和 C++11 之间的c_str功能规范的差异
- 在 C++98/03 中以相反的顺序将 C 数组附加到向量,而无需 for 循环
- 如何编译使用 C++11 库 API 的 C++03 项目?
- 在 C++03 中将 std::string 转换为 int
- 在不同的内存位置同时写入 std::d eque 是否线程安全?
- G++ (C++14) 链接器错误,用于处理 C++03 代码
- 如何在 C++03 中没有重复代码的情况下在堆栈上创建一个非常量 C 字符串数组?
- 将对象从一个 std::d eque 移动到另一个的更好方法
- c++03:由于enable_if,相互排斥的方法
- C++ 03 类模板 这是转换构造函数还是转换运算符?以及如何声明解决此问题的方法
- 在 C++ 03 中,如何引用一个被煽动的模板函数的地址
- 为什么 std::d eque 不允许指定存储桶大小?
- 如何有效地将一系列项目插入中间的 std::d eque 中,带有 C++03