创建 STL - 身份映射的最简单方法是啥?

Posted

技术标签:

【中文标题】创建 STL - 身份映射的最简单方法是啥?【英文标题】:What's the simplest way to create an STL - identity map?创建 STL - 身份映射的最简单方法是什么? 【发布时间】:2009-02-13 10:51:19 【问题描述】:

我想初始化一个映射 - 对象“id”,其身份从 0 到 n-1,即

 id[0] = 0
 id[1] = 1
 .
 .
 id[n-1] = n-1

有没有一种简单的方法 - 单线,地图对象内的方法,非常简单的东西 - 可以做到这一点?

【问题讨论】:

【参考方案1】:

有什么问题

for(unsigned int i = 0; i < n; ++i)
    id[i] = i;

【讨论】:

我期待 STL 提供一种方法来促进这个循环。 我发现 STL 会将一些简单的任务变成更多(字符或行)代码。这是因为它的设计方式,例如使用迭代器类而不是整数,以允许更通用的迭代。就我个人而言,我在简单的任务中避免使用 STL,普通代码通常更快更容易调试。 任何内置的 STL 都只会在底层解析到这个循环,除非有更多的击键。【参考方案2】:

你可以使用

template <class InputIterator>
map(InputIterator f, InputIterator l,
    const key_compare& comp)

构造函数的形式,但您需要构建一个 InputIterator 用作您想要的范围内的生成器函数。这比仅仅使用 for 循环要多得多。

【讨论】:

【参考方案3】:

使用键是简单索引的映射似乎有点奇怪。你确定你不能使用向量吗?这样做,您可以使用boost::counting_iterator 来填充向量:

std::vector<int> v(boost::counting_iterator<int>(0), 
                   boost::counting_iterator<int>(N-1));
// v is filled with integers from 0 to N-1

但是,与简单的 for 循环相比,我不确定这是否是一个巨大的收获。

【讨论】:

【参考方案4】:

注意 std::iota 作为数值库的一部分(C++0x 特性):

template <ForwardIterator Iter, HasPreincrement T>
requires OutputIterator<Iter, const T&>
void iota(Iter first, Iter last, T value);

【讨论】:

以上是关于创建 STL - 身份映射的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

识别印度游客的最简单、最轻松的方法是啥?

在 jQuery 中每 5 秒调用一次函数的最简单方法是啥? [复制]

创建可读 JSON 字符串的最简单方法是啥?

在 python 中将字符转换为其 ascii 等价物的最简单方法是啥? [复制]

从JSON格式的字符串创建python列表的最简单方法是啥[重复]

使用 firebase 创建简单身份验证的最佳方法是啥?