0

我想知道如何动态地将数据插入到集合中。我有一个带有不同点的文本文件,我需要动态插入到集合中,因为我不知道那里会有多少项目。

样本.txt

Point [3 4]
Point [5 6]

主文件

 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是集合容器,下面的代码集循环到文件末尾。

Q1:如果我这样做,我的套装只有一件还是多件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;
}
4

3 回答 3

4

Q1:如果我这样做,我的套装将只有一项或多项 temp_p

那要看。该集合只会存储唯一 Point的 s,因此如果temp_p每次都不同,它们都会被存储。a 的“唯一性”Point是使用用于集合排序的比较函数确定的。如果不大于且不大于,则两个元素AB相等。ABBA

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";
}
于 2012-11-14T11:13:24.050 回答
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);
}
于 2012-11-14T11:17:38.563 回答
-2

Q1:如果我这样做,我的套装将只有一件或多件temp_p

由于您使用的是定义为存储唯一键的集合容器,因此您将获得每个点的唯一值。如果您使用的是多重集,那么您将有多个值。

Q2 如何打印出集合内的值?

我同意 juanchopanza 写的。

顺便说一句:通过查看您的代码,您读取的每个点,插入的值似乎都是[3 4等等。这是您打算做的吗?

于 2012-11-14T11:41:44.980 回答