与集合一起存储(x,y)坐标

时间:2019-02-02 15:29:01

标签: c++

在将一组(x,y)坐标存储在一组中时,我需要帮助。 我的存储方式是

set<int> s;
s.insert( (1, 1) );
s.insert( (1, 3) );
s.insert( (3, 1) );
s.insert( (3, 3) );

for (auto x: s) {
     cout << x << endl;
}

,但它不打印出(1,1),(1,3).... 并打印出1、3。

我很新的C ++,所以希望如果有人可以给我如何将这些值存储与一组的意见!

3 个答案:

答案 0 :(得分:5)

您的代码将发生以下情况:

s的类型为std::set<int>,因此适合存储类型为int的变量。

调用函数std::set<int>::insert期望类型的参数int。如果你s.insert((1, 3))你其实并不插入的的,但使用的逗号操作符的。它的工作方式如下:在表达式a, b中,对表达式a求值,然后对表达式b求值,并返回表达式b的结果作为整体的结果。表达。您可以在这里了解更多信息:How does the Comma Operator work

因此,s.insert((1, 3))产生s.insert(3),并且3被插入s

要实现所需的行为,可以使用标题std::pair中定义的utility。可能的方法如下:

std::set<std::pair<int, int>> s;
s.insert(std::make_pair(1, 1));
s.insert(std::make_pair(1, 3));
s.insert(std::make_pair(3, 1));
s.insert(std::make_pair(3, 3));

for (const auto& e : s) 
  std::cout << "(" << e.first << ", " << e.second << ") ";

输出:

  

(1,1)(1,3)(3,1)(3,3)

以下是使用初始化程序列表插入对的另一种语法:

s.insert({1, 3});

如果要就地构建对,而不是构造和插入对,则可以按如下方式使用std::set::emplace

s.emplace(1, 3);

答案 1 :(得分:1)

我想你想用的对,对是一类联接在一起的一对值,其可以被翻译为坐标x,y

#include <string.h>
#include <stdio.h>
#include <assert.h>

int removeChar(char *str, char chr)
{
    assert(str != 0);                   // Always control entry !
    char *str_pnt = strchr(str, chr);   

    if (str_pnt) {
        strcpy(str_pnt, str_pnt+1); 
        removeChar(str_pnt, chr);
    }
}

void main (void)
{
    char str[] = "the weather is cloudy";
    char char_to_delete = 'e';

    removeChar(str, char_to_delete);
    puts(str);
}

答案 2 :(得分:1)

A set<int>只能存储一个 INT,不 2 (在单个insert操作)。如果您写s.insert( (1, 3) );,则显然是要插入2,这是行不通的。这似乎在某种程度上工作,但实际上语法是玩无耻的手段欺骗你!

在这种情况下,表达式(1, 3)使用的是comma operator,它的作用是:求值1(等于1),将其丢弃 ,然后计算3,这显然是3,这是什么是返回:3,所以,你的发言实际上相当于s.insert(3);。这就是为什么您没有编译错误的原因。但这显然不是您想要的。

要解决该问题,您必须使用一次存储两个值的集合。有该数据类型,称为std::pair

所以您可以像这样声明它

set<std::pair<int,int>> s;

并像这样将数据插入其中

s.insert({1, 3});