小编Sch*_*eff的帖子

如何在C++中找到两个std :: set的交集?

我一直在尝试在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++中找到两个的交集?最好是内置功能?

非常感谢!

c++ std stdset stl-algorithm

77
推荐指数
4
解决办法
6万
查看次数

两个临时表的地址是否保证在同一个表达式中不同?

考虑以下程序:

#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在每种情况下返回什么的规则是什么?

c++ pointers language-lawyer temporary-objects

30
推荐指数
2
解决办法
1776
查看次数

python pandas创建数据框并强制多列类型

我能够创建数据框并强制一种数据类型

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'指定类型怎么办?

python pandas

7
推荐指数
1
解决办法
3138
查看次数

错误:非常量静态数据成员必须在行外初始化

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++ static class

7
推荐指数
2
解决办法
3374
查看次数

标准 C++ 库中 size_t 的有符号变体

标准 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 完全相同的位大小,但已签名。

c++ unsigned signed std size-t

7
推荐指数
1
解决办法
2195
查看次数

什么时候需要显式调用 std::move 以及什么时候不在 cpp 中?

我正在阅读 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 甚至不会让我在移动构造函数中设置断点。)

很高兴收到所有澄清!

c++ move-constructor c++11

7
推荐指数
1
解决办法
2360
查看次数

函数类型别名声明中是否允许嵌套括号?

以下代码可以使用 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

7
推荐指数
1
解决办法
178
查看次数

如何禁用具有特定id模式的div块?

我想写一个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].

html javascript dom userscripts

6
推荐指数
1
解决办法
1万
查看次数

是什么导致在使用包含冒号的类似函数的宏时出现这种编译器差异?

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()写入时正确扩展所有事件?这是在标准中明确定义的,还是特定于编译器的?

c++ gcc clang visual-c++ precompile

5
推荐指数
1
解决办法
76
查看次数

如何评估程序的运行时?

我开发了一个简单的程序,想在真机上评估它的运行时性能,例如我的 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)

c++ profile

5
推荐指数
1
解决办法
155
查看次数