使用STL来填充向量来自地图的键
map<T,Z> m= ...;
vector<T> v;
v.reserve(m.size);
for(map<T,Z>::iterator it=m.begin();it!=m.end();++it)
{
v.push_back(it->first);
}
是否有使用某些 STL 函数的更好的 1 行版本?
编辑:不使用c++11!
map<T,Z> m= ...;
vector<T> v;
v.reserve(m.size);
for(map<T,Z>::iterator it=m.begin();it!=m.end();++it)
{
v.push_back(it->first);
}
Is there a nicer 1-line version using some STL function(s)?
edit: not using c++11!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
可移植:
我认为 STL 的某些实现有一个名为
select1st
的非标准扩展,它相当于此处显示的SelectKey
。正如 K-Ballo 在评论中指出的那样,还有 TR1 版本。我喜欢明确命名的版本,因为它更容易看到发生了什么。由于不需要状态,因此您可以通过使用实际函数而不是函子来稍微减少样板代码:
如果您可以使用C++11,则可以使用 lambda,它可以保留选择代码靠近它的使用位置:
甚至是基于范围的 for 循环,这可能是最优雅和可读的:
Portable:
I think some implementations of STL have a non-standard extension called
select1st
, which is the equivalent ofSelectKey
shown here. As K-Ballo pointed out in the comments, there's also a TR1 version. I like the explicitly-named version as it's easier to see what's going on.Since there's no need for state, you can get away with slightly less boilerplate by using an actual function rather than a functor:
If you could use C++11, you could use a lambda, which keeps the selection code close to where it's used:
or even range-based for-loop, which is probably the most elegant and readable:
在 C++11 之前,您可以使用转换和自定义函数结构:
如果您有权访问 boost 或 TR1,则可以将
key_selector
替换为mem_fn
在 C++ 之后11、可以使用lambda:
Pre C++11, you could use transform and a custom function struct:
If you have access to boost or TR1, you can replace
key_selector
withmem_fn
Post- C++11, you can use lambdas:
在 C++11 中,您可以使用 lambda 表达式:
In C++11, you can use lambda expressions:
您可以执行以下操作:
其中 FUNCTOR 取决于您拥有的 STL 或库和编译器的版本。
C++11 (lambda)
C++11 (std::get)
C++ SGI STL 有一个名为 select1st 的函子,可以
像其他人描述的那样使用函子对象来使用 C++03(不是 C++11)。
You can do something along the lines of:
Where FUNCTOR depends on what version of the STL or libraries and compilers that you have.
C++11 (lambda)
C++11 (std::get)
C++ SGI STL has a functor called select1st which can be used
C++03 (Not C++11) using a functor object like other people have described.