我一直在尝试在C++中找到两个std :: set之间的交集,但我一直收到错误.
我为此创建了一个小样本测试
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
int main() {
set<int> s1;
set<int> s2;
s1.insert(1);
s1.insert(2);
s1.insert(3);
s1.insert(4);
s2.insert(1);
s2.insert(6);
s2.insert(3);
s2.insert(0);
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
后一个程序不生成任何输出,但我希望有一个新的集合(让我们称之为s3)具有以下值:
s3 = [ 1 , 3 ]
Run Code Online (Sandbox Code Playgroud)
相反,我得到错误:
test.cpp: In function ‘int main()’:
test.cpp:19: error: no matching function for call to ‘set_intersection(std::_Rb_tree_const_iterator<int>, std::_Rb_tree_const_iterator<int>, std::_Rb_tree_const_iterator<int>, std::_Rb_tree_const_iterator<int>)’
Run Code Online (Sandbox Code Playgroud)
我从这个错误中理解的是,没有定义set_intersection接受Rb_tree_const_iterator<int>参数.
此外,我想该std::set.begin()方法返回这种类型的对象,
有没有更好的方法std::set在C++中找到两个的交集?最好是内置功能?
非常感谢!
考虑以下程序:
#include <iostream>
int const * f(int const &i)
{
return &i;
}
int main()
{
std::cout << f(42); // #1
std::cout << f(42); // #2
std::cout << f(42) << f(42); // #3
}
Run Code Online (Sandbox Code Playgroud)
根据编译器和设置的优化级别,打印在行上的地址可能彼此不同#1,#2也可能不同。
但是,无论选择何种编译器或优化级别,行#3中打印的 2 个地址总是彼此不同。
这是一个可以玩的演示。
那么f在每种情况下返回什么的规则是什么?
我能够创建数据框并强制一种数据类型
import pandas as pd
test = pd.DataFrame({'a':[1,2,3], 'b':[1.1,2.1,3.1]}, dtype=int)
Run Code Online (Sandbox Code Playgroud)
但我想为每列指定类型.我怎样才能做到这一点?我尝试了以下不起作用,因为生成的dtypes是对象,b列不会转换为整数.
test = pd.DataFrame({'a':[1,2,3], 'b':[1.1,2.1,3.1]}, dtype=[('a', int),('b', int)])
Run Code Online (Sandbox Code Playgroud)
杰夫帮助解决了上述问题.但是当我尝试创建一个空数据帧并且我希望能够指定列类型时,我发现了另一个问题.对于跨列的单一类型,我可以这样做
test = pd.DataFrame(columns=['a','b'], dtype=int)
Run Code Online (Sandbox Code Playgroud)
如果我想为每个'a'和'b'指定类型怎么办?
class Solution {
public:
static int m=INT_MIN; // it shows error: non-const static data member must
be initialized out of line.(why?)
using "int m=INT_MIN" is fine.
int func(TreeNode*root){
if(root==NULL){
return 0;
}
int l=max(func(root->left),0);
int r=max(func(root->right),0);
m=max(l+r+root->val,m);
return max(l,r)+root->val;
}
int maxPathSum(TreeNode* root) {
if(root==NULL)
{
return 0;
}
m=INT_MIN;
int x=func(root);
return m;
}
};
Run Code Online (Sandbox Code Playgroud)
我需要更新 variable 的值m。因此我使用static int数据类型。但是下面的错误来了。使用int而不是static int工作正常。但是为什么会static int报错呢?

标准 C++ 中是否有 size_t 的有符号变体?意味着与 size_t 完全相同的位大小,但有符号。
我当然可以这样做:
#include <type_traits>
using signed_size_t = std::make_signed_t<std::size_t>;
Run Code Online (Sandbox Code Playgroud)
但也许标准库中已经有类似的定义,而不是发明额外的类型名称?
我知道有 ssize_t 和 ptrdiff_t,都有签名。但根据他们的描述,它们似乎都可以具有与 size_t 不同的位大小。但我需要与 size_t 完全相同的位大小,但已签名。
我正在阅读 Stroustrup 的“C++ v2 之旅”。这当然不是一本 C++ 初学者的书,但很有趣。
我用谷歌搜索了一下,但对这个没有任何兴趣。
现在,我想我明白编译器何时可以使用移动构造函数,但显然我不明白。在这里,我展示了移动构造函数以及我认为会使用它的函数。事实并非如此。仅当我明确使用 std::move 时。为什么是这样?我的理解是,本地r将在返回时隐式“移动”。
template<typename T>
Vector<T>::Vector(Vector<T> && a) // move constructor
:elem{a.elem},sz{a.sz}{
a.elem=nullptr;
a.sz=0;
}
template<typename T>
Vector<T> moveVectorAfterAdd(const Vector<T> & v1, const Vector<T> & v2){
Vector<T> r = v1+v2;
return std::move(r);
//return r;
}
int main(void) {
Vector<double> v1(1);
Vector<double> v2=v1;
Vector<double> v3=v2;
Vector<double> v4=moveVectorAfterAdd(v1,v2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,如果我实际上不使用 std::move,尽管编译时没有进行任何优化,lldb 甚至不会让我在移动构造函数中设置断点。)
很高兴收到所有澄清!
以下代码可以使用 gcc-13 和 clang-16 编译,但 MSVC 报告多个错误
using foo_type = void ((((int, const char*)))); // (1)
// Compiler messages for line (1):
// clang-16: ok.
// gcc-13: ok.
// MSVC-v19: error C2062: type 'int' unexpected.
foo_type foo;
int main()
{
foo(5, "Hello");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是:谁是对的?标准是否允许alias-declaration函数类型在参数列表周围有多个嵌套括号,就像上面的示例中所尝试的那样?
c++ language-lawyer compiler-specific c++17 alias-declaration
我想写一个greasemonkey脚本来禁用某个页面上的div.在页面的任何给定负载上,我不知道div在div中的位置,但我知道它总是被调用<div id = "alertPanel"> ....</div>
我该怎么做才能禁用这个div?
我的初步想法是:
var myDivs= document.getElementsByTagName('div');
for (i=0; i<myDivs.length; i++)
{
if (myDivs[i].<get id property somehow> = "alertPanel")
myDivs[i].style.visibility = 'hidden';
}
Run Code Online (Sandbox Code Playgroud)
但是你可以告诉我,我一直在访问id属性以进行相等检查.
很明显,我正在使用文本编辑器来编写这个 - 我猜测标准的javascript编辑器在输入后会给出一个自动完成列表 myDivs[i].
该A()宏只会在 MSVC 上扩展,而不会在 GCC/Clang 上扩展,除非A()带有前缀,例如Test A().
通过在-E( /E) 标志 ( Godbolt.org )下运行以下代码段:
#define A() HelloWorld::
#define B() ::
A()
B()
Run Code Online (Sandbox Code Playgroud)
我们看到 MSVC 给出了以下输出:
HelloWorld::
::
Run Code Online (Sandbox Code Playgroud)
而 GCC/Clang 给出了不同的输出:
::
Run Code Online (Sandbox Code Playgroud)
但是然后运行这个片段:
#define A() HelloWorld::
A()
Test A()
Run Code Online (Sandbox Code Playgroud)
在所有 3 个编译器上为我们提供以下信息:
HelloWorld::
Test HelloWorld::
Run Code Online (Sandbox Code Playgroud)
为什么 GCC/Clang 输出缺少第一行?为什么它在Test A()写入时正确扩展所有事件?这是在标准中明确定义的,还是特定于编译器的?
我开发了一个简单的程序,想在真机上评估它的运行时性能,例如我的 MacBook。源代码如下:
#include <stdio.h>
#include <vector>
#include <ctime>
int main () {
auto beg = std::clock () ;
for (int i = 0; i < 1e8; ++ i) {
}
auto end = std::clock () ;
printf ("CPU time used: %lf ms\n", 1000.0*(end-beg)/CLOCKS_PER_SEC) ;
}
Run Code Online (Sandbox Code Playgroud)
它是用 gcc 编译的,优化标志设置为默认值。在 bash 脚本的帮助下,我运行了 1000 次,并通过我的 MacBook 记录了运行时间,如下所示:
[130.000000, 136.000000): 0
[136.000000, 142.000000): 1
[142.000000, 148.000000): 234
[148.000000, 154.000000): 116
[154.000000, 160.000000): 138
[160.000000, 166.000000): 318
[166.000000, 172.000000): 139
[172.000000, 178.000000): 40
[178.000000, 184.000000): …Run Code Online (Sandbox Code Playgroud)