【发布时间】:2012-05-02 19:31:38
【问题描述】:
在 C++11 中使用元组有哪些好的用例?例如,我有一个定义局部结构的函数,如下所示:
template<typename T, typename CmpF, typename LessF>
void mwquicksort(T *pT, int nitem, const int M, CmpF cmp, LessF less)
{
struct SI
{
int l, r, w;
SI() {}
SI(int _l, int _r, int _w) : l(_l), r(_r), w(_w) {}
} stack[40];
// etc
我正在考虑用 std::tuple<int,int,int> 替换 SI 结构,这是一个更短的声明,其中包含已经预定义的方便的构造函数和运算符,但有以下缺点:
- 元组元素隐藏在模糊的、实现定义的结构中。即使 Visual Studio 很好地解释和显示了它们的内容,我仍然不能放置依赖于元组元素值的条件断点。
- 访问单个元组字段 (
get<0>(some_tuple)) 比访问结构元素 (s.l) 详细得多。 - 按名称访问字段比按数字索引提供更多信息(而且更短!)。
tie 函数在某种程度上解决了最后两点。考虑到这些缺点,什么是元组的好用例?
更新 结果发现 VS2010 SP1 调试器无法显示以下数组 std::tuple<int, int, int> stack[40] 的内容,但在使用 struct 编码时可以正常工作。所以这个决定基本上是不费吹灰之力的:如果你必须检查它的值,使用 struct [esp.对 GDB 等调试器很重要]。
【问题讨论】:
-
索引问题可以通过正确定义的常量/枚举来解决。
-
你写了一个排序函数,接受
T*, size? lolwot,你为什么会做这样的事情。 -
@zvrba :他不是在拖钓(或者他可能是,但是),他是对的。
-
"仅供参考,主程序中的底层数据结构是一个向量(我不是受虐狂,所以我不想手动摆弄分配),指针来自
&vec[0]." 所以传递std::vector<T>&而不是T*并使 API 更合理。 (顺便说一句,对你希望帮助你的人咄咄逼人是有点愚蠢的。) -
@zvrba:只需要两个通用迭代器。通过
v.begin()和v.end(),或std::begin(arr)和std::end(arr)。完成。