动态插入一组

时间:2012-11-14 11:08:36

标签: c++ set

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

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;
}

3 个答案:

答案 0 :(得分:4)

  

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

这取决于。该集合仅存储唯一的Point,因此如果temp_p每次都不同,则它们都将被存储。 Point的“唯一性”是使用用于集合排序的比较函数来确定的。  如果A不大于BA不大于B,则BA两个元素相等。

  

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等等。这是你打算做的吗?