小编mab*_*ble的帖子

如何取消引用数组数组?

我正在研究一个Perl Dancer2 webapp,并偶然发现我有一个数组,其中包含位于第2位的数组的数组.我将对该数组的引用传递给sub,然后遍历数组(包含数组) ).

当我尝试将最里面的数组放入foreach()循环中时@$$_[2],我收到一个错误:

不是SCALAR参考

我可以轻松解决这个问题:

my $ref = $$_[2];
print "@$ref\n";
Run Code Online (Sandbox Code Playgroud)

但我想知道为什么第一种方法不起作用.

看看我的最小例子:

my @x = (["a", "b", [1, 2], "c"],
         ["x", "y", [8, 9], "z"]);
my $y = \@x;

foreach (@$y) {
#   print "@$$_[2]\n"; #produces error

    my $z = $$_[2];
    print "@$z\n"; #works
}
Run Code Online (Sandbox Code Playgroud)

有什么想法在这里发生了什么?

arrays perl reference

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

shared_ptr的unordered_set没有找到它存储的等效对象

我有一个存储std::vector东西的课程.在我的计划,我创建std::unordered_setstd::shared_ptr这个类的对象(见下面的代码).我定义了自定义函数来计算哈希值和相等性,以便unordered_set"使用"对象而不是指针.这意味着:对于具有相同内容的不同对象的两个不同指针应被视为相等,我们称之为"等效".

到目前为止,一切都按预期工作,但现在我偶然发现了一个奇怪的行为:我添加一个指向对象的指针,unordered_set并创建一个指向具有相同内容的不同对象的不同指针.如上所述,我希望它my_set.find(different_object)会将有效的迭代器返回到存储在集合中的等效指针.但事实并非如此.


这是一个最小的工作代码示例.

#include <boost/functional/hash.hpp>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <memory>
#include <unordered_set>
#include <vector>

class Foo {
public:
    Foo() {}
    bool operator==(Foo const & rhs) const {
        return bar == rhs.bar;
    }
    std::vector<int> bar;
};

struct FooHash {
    size_t operator()(std::shared_ptr<Foo> const & foo) const {
        size_t seed = 0;
        for (size_t i = 0; i < foo->bar.size(); ++i) { …
Run Code Online (Sandbox Code Playgroud)

c++ c++17

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

标签 统计

arrays ×1

c++ ×1

c++17 ×1

perl ×1

reference ×1