在将一组(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 ++,所以希望如果有人可以给我如何将这些值存储与一组的意见!
答案 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});