C++11 如何显示自己数据类型的std::vector的内容,并使用std::copy在控制台上显示名称?

C++11 如何显示自己数据类型的std::vector的内容,并使用std::copy在控制台上显示名称?,c++11,C++11,我想使用std::copy来显示std::vector的内容,这与我在下面代码中通过std::for_实现的方式类似 #include <iostream> #include <vector> #include <string> #include <algorithm> class User { private: std::string m_sName; public: User(std::string sName):m_sName

我想使用
std::copy
来显示
std::vector
的内容,这与我在下面代码中通过
std::for_实现的方式类似

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
class User {
private:
    std::string m_sName;
public:
    User(std::string sName):m_sName(sName) {}
    std::string GetName()const {
        return m_sName;
    }
};
int main()
{
    std::vector<User> vectNames;
    vectNames.emplace_back("Jack");
    vectNames.emplace_back("George");
    vectNames.emplace_back("Jose");
//How can I get std::copy to do what the std::for_each is doing?
    std::copy(vectNames.begin(), vectNames.end(), std::ostream_iterator<User>(std::cout, "\n"));
//The following line is what I really would like std::copy to do. 
    std::for_each(vectNames.begin(), vectNames.end(), [](const User &user) {std::cout << user.GetName() << "\n"; });
    
}
#包括
#包括
#包括
#包括
类用户{
私人:
std::字符串m_sName;
公众:
用户(std::string sName):m_sName(sName){}
std::string GetName()常量{
返回m_sName;
}
};
int main()
{
std::向量向量名称;
vectNames.安置回(“杰克”);
vectNames.安置回(“乔治”);
vectNames.安置回(“Jose”);
//如何让std::copy执行std::for_正在执行的操作?
std::copy(vectNames.begin()、vectNames.end()、std::ostream\u迭代器(std::cout,“\n”);
//下面这行是我真正希望std::copy执行的操作。

std::for_each(vectNames.begin()、vectNames.end()、[](const User&User){std::cout您可以简单地重载
ostream
操作符:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

class User {
private:
    std::string m_sName;
public:
    User(std::string sName):m_sName(sName) {}
    std::string GetName()const {
        return m_sName;
    }
    void print(std::ostream& where) const
        { where << m_sName; }
};

/// Overloaded ostream operator
std::ostream& operator<< (std::ostream& out, const User& user)
{
    user.print(out);
    return out;
}

int main()
{
    std::vector<User> vectNames;
    vectNames.emplace_back("Jack");
    vectNames.emplace_back("George");
    vectNames.emplace_back("Jose");
    
    std::copy(vectNames.begin(), vectNames.end(), std::ostream_iterator<User>(std::cout, "\n"));
}
#包括
#包括
#包括
#包括
类用户{
私人:
std::字符串m_sName;
公众:
用户(std::string sName):m_sName(sName){}
std::string GetName()常量{
返回m_sName;
}
无效打印(标准::ostream&where)常量

{where由于您的评论,我是一名新的程序员,正在尝试不同的想法,我将此答案发布为另一种方法,它还展示了一些您可能感兴趣的算法

我认为如果你想做的是两者兼而有之的话,
std::copy
不是正确的工具

  • 对集合中的对象调用成员函数,并且仅在此之后
  • 将它们复制/打印到屏幕上

  • 一种可能是最好的方法是中的方法,它基本上只通过
    std::copy
    解决第2点(根据您的问题,这是您已经知道的方法),第1点,通过重载
    你能告诉我们为什么需要
    std::copy
    吗?
    std::for_each
    似乎确实是一个更好的工具来完成你的工作。你并不是真的在任何地方复制
    vectNames
    ;事实上,你就是它,转换的结果就是你想要打印的/“copy”在屏幕上。我是一名新程序员,正在尝试不同的想法。很高兴知道。我添加了一个答案,您可能会喜欢:)哇!非常感谢!我真的非常感谢您为我展示了一种不同的方法!非常感谢!我已将此标记为最佳答案!我发现您展示给我的其他一些方法非常吸引人!这增加了我的知识!我的IDE(Visual Studio 2019)不承认下面的内容包括:包含GeorgeAustinBradley的任何潜在的解决方案吗?我在C++ 17中有它。@也许安装Boost?我在ARCLinux上,所有的东西都是用它来做的。我猜你在Windows上,这总是很痛苦的。大概已经存在了关于如何安装的问题。l Boost库。这与Windows无关,Boost总是需要安装的,而且它显然是在您的ArchLinux中。@Georgaeustinbradley,最好找到Boost与特定MS产品相关的信息,以避免意外。@zdim,是的,我可能会用开箱即用的部分误导读者;我的意思是在Arch上安装Boost没有任何作用不要执行多个命令,即
    pacman-sboost