我想知道如何动态地将数据插入到集合中。 我有一个带有不同点的文本文件,我需要动态插入到集合中,因为我不知道会有多少项目。
sample.txt的
Point [3 4]
Point [5 6]
的main.cpp
set<Point> s_p2;
if (strData.find("Point") != string::npos) {
pos = strData.find("t");
strData = strData.substr(pos + 2, 4);
istringstream in(strData);
Point temp_p;
in >> temp_p;
s_p2.insert(temp_p);
}
s_p2
是set容器,下面的代码集循环到文件末尾。
问题1:如果我这样做,我的套装中只有1件商品或多件商品temp_p
吗?
Q2:如何打印出套装中的值?
ostream& operator<<(ostream &out, Point &p2) {
p2.setDistFrOrigin();
out << "[" << setw(4) << p2.getX() << setw(1) << "," << setw(4) << p2.getY() << "] " << setprecision(3) << p2.getScalarValue() << endl;
}
答案 0 :(得分:4)
Q1:如果我这样做,我的套装只有1项或多项temp_p
这取决于。该集合仅存储唯一的Point
,因此如果temp_p
每次都不同,则它们都将被存储。 Point
的“唯一性”是使用用于集合排序的比较函数来确定的。
如果A
不大于B
且A
不大于B
,则B
和A
两个元素相等。
Q2如何打印出设置旁边的值?
您应该定义std::ostream& operator<<(std::ostream& os, const Point& p)
运算符,然后使用std::cout
。例如:
std::ostream& operator<<(std::ostream& os, const Point& p)
{
return os << p.someMethod() << " " << p.someOtherMethod();
}
然后,
std::set<Point> pointSet = ....;
for (std::set<Point>::const_iterator it = pointSet.begin();
it!= pointSet.end();
++it)
{
std::cout << *it << "\n";
}
或者,在c ++ 11中
for (const auto& p : pointSet)
{
std::cout << p << "\n";
}
答案 1 :(得分:1)
假设您的所有代码都有效:
Q1-你会在集合中获得多个项目,因为每次代码都会运行,如果创建了一个新的temp_p,然后在你输入时将其复制到集合中
Q2-您可以使用迭代器来浏览集并打印其项目:
set<Point>::iterator mySetIterator;
for (mySetIterator = s_p2.begin(); mySetIterator != s_p2.end(); mySetIterator++)
{
//print mySetIterator, where mySetIterator is a pointer to the n-th value of your set
cout<<(*mySetIteartor);
}
答案 2 :(得分:-2)
Q1:如果我这样做,我的设置只有1个项目或多个项目
temp_p
由于您使用的是设置容器(定义为存储唯一键),因此您将获得每个点的唯一值。如果您使用的是multiset,那么您将拥有多个值。
Q2如何打印出设置中的值?
我同意juanchopanza所写的内容。
顺便说一句:通过查看你的代码,看来你读到的每个点,插入的值是[3 4
等等。这是你打算做的吗?