【发布时间】:2011-10-07 04:05:42
【问题描述】:
如何访问存储在数据结构multiset、C++中的值?
for (int i = 0; i < mlt.size; i++)
{
cout << mlt[i];
}
【问题讨论】:
标签: c++ data-structures multiset
如何访问存储在数据结构multiset、C++中的值?
for (int i = 0; i < mlt.size; i++)
{
cout << mlt[i];
}
【问题讨论】:
标签: c++ data-structures multiset
如果 T 是您的多重集中包含的类型,
for (std::multiset<T>::const_iterator i(mlt.begin()), end(mlt.end());
i != end;
++i)
std::cout << *i << "\n";
【讨论】:
看这个例子:http://www.cplusplus.com/reference/stl/multiset/begin/
基本上,您可以像遍历任何其他 stl 容器一样遍历多重集。
【讨论】:
您应该不(通常)通过编写循环来这样做。您通常应该使用预先编写好的算法,例如std::copy:
std::copy(mlt.begin(), mlt.end(),
std::ostream_iterator<T>(std::cout, "\n"));
视情况而定,有很多有用的变体,例如使用我在previous answer 中发布的infix_ostream_iterator。这主要在您想要分隔列表中的项目时很有用,以获取(例如)1,2,3,4,5 而不是ostream_iterator 会产生的1,2,3,4,5,。
【讨论】:
algorithm 来实现非常明显的事情,比如打印所有值会使代码更清晰。特别是带有中缀运算符的示例证明了我的观点。只需将输出 1, 2, 3, 4, 5 所需的代码量和所需的语言掌握水平与 for 循环和您的方法进行比较。恕我直言,您的方法引入了几个不必要的概念(ostream_operator、copy),这些概念并不容易提倡高级 C++ 功能。
multimap,然后将答案更新为涵盖multiset,而没有切换到copy 和ostream_iterator。不过,我确实同意@Vlad,您的中缀迭代器仅在编写和维护代码的 C++ 大师在场时才有用:)
copy 的代码的整个 比单独定义std::multiset<T>::const_iterator 的代码更容易阅读、编写和理解。维护也更简单——考虑一下当用户决定尝试使用 unordered_multiset 时会发生什么。使用副本,无需更改。使用循环,您需要更改 每个 实例中最复杂的部分。
std::ostream_iterator 更多。
infix_ostream_operator?使用 for 循环不是很简单吗?另一个问题:我个人不将打印值与复制到特制的流迭代器相关联,因此与 copy/infix_ostream_operator 相比,for 循环直接反映了我的思维方式。我承认其他开发者的思维方式不同。
C++11 的 auto 很方便。
for(auto t : mlt){
cout << t << endl;
}
【讨论】: