微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我想使用std::vector<User>显示std::copy内容,类似于在下面的代码中通过std::for_each实现它的方式。

#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(),[](const User &user) {std::cout << user.GetName() << "\n"; });
    
}

解决方法

您可以简单地重载import UIKit import FirebaseFirestore class ProductsVC: UIViewController,ProductCellDelegate { // Outlets @IBOutlet weak var tableView: UITableView! // Variables var products = [Product]() var category: Category! var listener: ListenerRegistration! var db : Firestore! var showFavorites = false override func viewDidLoad() { super.viewDidLoad() db = Firestore.firestore() tableView.delegate = self tableView.dataSource = self tableView.register(UINib(nibName: Identifiers.ProductCell,bundle: nil),forCellReuseIdentifier: Identifiers.ProductCell) setupQuery() } func setupQuery() { var ref: Query! if showFavorites { ref = db.collection("users").document(UserService.user.id).collection("favorites") } else { ref = db.products(category: category.id) } listener = ref.addSnapshotListener({ (snap,error) in if let error = error { debugPrint(error.localizedDescription) } snap?.documentChanges.forEach({ (change) in let data = change.document.data() let product = Product.init(data: data) switch change.type { case .added: self.onDocumentAdded(change: change,product: product) case .modified: self.onDocumentModified(change: change,product: product) case .removed: self.onDocumentRemoved(change: change) } }) }) } 运算符:

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::copy不是正确的工具

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

一种方法,也许是最好的方法,是atru's answer中的一种方法,该方法基本上只用std::copy解决了第2点(根据您的实际情况,这已经是您已经知道的方法了)问题),并通过重载<<来指向1,从而达到目的。

我提出的替代方案基于这样的想法,即“在集合的每个对象上调用成员函数”实际上是该集合的 transform 操作。 std::transform然而,就像std::copy作用于迭代器一样,而不作用于范围,因此它们很难轻易地彼此组合。

Boost附带boost::copyboost::adaptors::transformed,可让您执行以下操作:

boost::copy(
        vectNames | transformed([](auto const& x){ return x.GetName(); }),std::ostream_iterator<std::string>(std::cout,"\n")
    );

其中vectNames被“输送到” transformed中,这将lambda应用于集合的每个元素,从而产生一个新的临时集合,该集合是boost::copy的参数。如果要使用std::copy,则必须将临时文件存储在某个地方,例如在temp中,然后将其迭代器std::copytemp.begin()传递给temp.end()

完整示例如下。我希望它能使您对不同的,更实用的方法有所了解。

#include <functional>
#include <iostream>
#include <vector>
#include <string>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm/copy.hpp>
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");

    using boost::adaptors::transformed;
    boost::copy(
        vectNames | transformed([](auto const& x){ return x.GetName(); }),"\n")
    );
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。