C ++函数打印一组

斯塔恩·比约斯特(Starne Bjoustrop)

有谁知道为什么

#include <set>
#include <string>
#include <iostream>

template <typename T>
std::string set2Str(const std::set<T> & S)
{
    std::string retstr = "{";
    typename std::set<T>::const_iterator it(S.begin()), offend(S.end());
    if (it != offend)
        retstr.push_back(*it++);
    while (it != offend)
    {
        retstr.push_back(',');
        retstr.push_back(*it++);
    }
    retstr.push_back('}');
    return retstr;
}

int main()
{
    std::set<int> mySet = {1, 5, 9, 69};
    std::cout << set2Str(mySet);
}

正在输出

{,,   ,E}

????

另外,有没有更优雅的方式编写函数set2Str逗号引起的篱笆问题使我的程序变得难看。

WhozCraig

当您的算法执行此操作时:

retstr.push_back(*it++);

打入目标字符串的值被视为(并尽可能转换为)char{1, 5, 9, 69}不包含char; 它包含int结果将它们视为ASCII代码点,请参见此表,并特别注意dec其中每个字符值。注意E例如的值

这是众多目的之一std::ostringstream为制成,并具有允许的好处什么可以写入字符流是可表示的,包括利用自定义插入运营商。

#include <iostream>
#include <sstream>
#include <string>
#include <set>
#include <tuple>

template<typename T, typename... Args>
std::string set2str(const std::set<T,Args...>& obj)
{
    std::ostringstream oss;

    oss << '{';
    auto it = obj.cbegin();
    if (it != obj.cend())
    {
        oss << *it++;
        while (it != obj.cend())
            oss << ',' << *it++;            
    }
    oss << '}';
    return oss.str();
}

// custom class to demonstrate custom insertion support
class Point
{
    friend std::ostream& operator <<(std::ostream& os, const Point& pt)
    {
        return os << '(' << pt.x << ',' << pt.y << ')';
    }

private:
    double x,y;

public:
    Point(double x, double y) : x(x), y(y) {}

    // used by std::less<> for set ordering
    bool operator <(const Point& pt) const
    {
        return std::tie(x,y) < std::tie(pt.x,pt.y);
    }
};

int main()
{
    std::set<int> si = { 1,2,3,4,5 };
    std::set<double> sd = { 1.1, 2.2, 3.3, 4.4, 5.5 };
    std::set<char> sc = { 'a', 'b', 'c', 'd', 'e' };
    std::set<unsigned> empty;

    std::cout << set2str(si) << '\n';
    std::cout << set2str(sd) << '\n';
    std::cout << set2str(sc) << '\n';
    std::cout << set2str(empty) << '\n';

    // using custom class with implemented ostream inseter
    std::set<Point> pts { {2.2, 3.3}, {1.1, 2.2}, {5.5, 4.4}, {1.1, 3.3} };
    std::cout << set2str(pts) << '\n';

    return EXIT_SUCCESS;
}

输出量

{1,2,3,4,5}
{1.1,2.2,3.3,4.4,5.5}
{a,b,c,d,e}
{}
{(1.1,2.2),(1.1,3.3),(2.2,3.3),(5.5,4.4)}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C(preferred)/ C ++中将一组一维数组顺序传递给函数

来自分类Dev

如何编写一个不断读取一组行并标记行长度的C函数

来自分类Dev

C ++中的一组集合

来自分类Dev

一组线程的C ++互斥锁

来自分类Dev

在C ++中添加一组数字

来自分类Dev

如何遍历一组C ++

来自分类Dev

如何在C#中构建一个函数,该函数返回一组定界的字符串号?

来自分类Dev

如何用C中的一组目标文件编译一组C文件

来自分类Dev

C ++:在多图中存储三个一组

来自分类Dev

C ++ MFC:将通用控件分为一组

来自分类Dev

在C ++ 11中迭代产生一组线程?

来自分类Dev

C ++删除一组列表中的重复项

来自分类Dev

C#如何创建一组集合

来自分类Dev

用C语言查找一组数字的整数除数

来自分类Dev

C ++中一组运算符的重载

来自分类Dev

C#如何创建一组集合

来自分类Dev

C#将不同的值分成一组

来自分类Dev

不断移动一组图片框 C#

来自分类Dev

在 C++ 中查找一组结构

来自分类Dev

C++ 将一组值映射到类型

来自分类Dev

逻辑错误:平均质心的计算不正确,“入口”函数的无限执行-K表示针对一组点的聚类,在C ++中

来自分类Dev

打印一组的所有子集

来自分类Dev

打印包含True的一组

来自分类Dev

C:提取一组特定的位?需要帮助解释一个特定的例子

来自分类Dev

C ++:遍历一组向量中的一个向量

来自分类Dev

无法从一组字符串中取出一个数字-C

来自分类Dev

C++ 在 Map 中某个类的一组值中插入一个值

来自分类Dev

创建一组Python函数

来自分类Dev

C ++确保将对象分配给一组对象