如何解决如何显示我自己的数据类型的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
不是正确的工具
- 仅在此之后,才对集合中的对象调用成员函数
- 将它们复制/打印到屏幕上
一种方法,也许是最好的方法,是atru's answer中的一种方法,该方法基本上只用std::copy
解决了第2点(根据您的实际情况,这已经是您已经知道的方法了)问题),并通过重载<<
来指向1,从而达到目的。
我提出的替代方案基于这样的想法,即“在集合的每个对象上调用成员函数”实际上是该集合的 transform 操作。 std::transform
然而,就像std::copy
作用于迭代器一样,而不作用于范围,因此它们很难轻易地彼此组合。
Boost附带boost::copy
和boost::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::copy
和temp.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 举报,一经查实,本站将立刻删除。