小编Ale*_*sie的帖子

Foreach vs common for循环

我刚开始学习Java,我遇到的第一件事是foreach循环,不知道它的工作方式我做的第一件事是:

int[] array = new int [10];
for (int i: array){
    i = 1;
}
Run Code Online (Sandbox Code Playgroud)

显然无法分配1给数组的每个元素.然后我添加System.out.print(i);(后i = 1;)到循环的主体,看到屏幕的输出是,1111111111但因为i在循环内做一些事情是有效的,很可能i是数组的每个元素的副本,不是吗?(第一个问题)

如果上述情况属实,这并不意味着foreach循环比公共for循环要慢得多,因为它涉及制作数组中每个元素的副本?或者既然Java没有指针和指针算术,oprator[]可能会以其他一些"糟糕"的方式设计复制每个元素实际上更快?

如果上述假设为真,为什么人们会使用明显较慢的foreach循环而不是共同的for循环呢?

简而言之:

  • i每个元素的副本array吗?如果不是那么呢?

  • foreach循环不是比普通循环慢吗?如果没有,那么operator[]设计的"糟糕"程度如何?

  • 除了在foreach循环中获胜的可读性之外别无其他吗?

java foreach

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

为什么clone()不能按预期工作?

在java中使用以下代码

public Polynomial multiply(Polynomial aPolynomial){
    Polynomial ret = new Polynomial();
    for (Tuple i: this.pol){
        Polynomial temp = aPolynomial.clone();
        System.out.print(temp);
        for (Tuple j: temp.pol){
            j.setCoef(j.getCoef() * i.getCoef());
            j.setPower(j.getPower() + i.getPower());
        }
        ret = ret.add(temp).clone();
    }       
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出System.out.print(temp)总是不同的值.这意味着aPolynomial在运行时期间某处改变了get.

更改Polynomial temp = aPolynomial.clone();到:

LinkedList<Tuple> list1 = (LinkedList<Tuple>) aPolynomial.pol.clone();
Polynomial temp = new Polynomial(list1);
Run Code Online (Sandbox Code Playgroud)

System.out.print(temp)在每次循环运行时,输出也没有帮助.

我的错误在哪里?

编辑:

public Polynomial clone() {
    try {
        return (Polynomial)super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return null;
} …
Run Code Online (Sandbox Code Playgroud)

java clone

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

复制构造函数调用无限循环,尽管通过引用调用

调用循环的代码:

Foo temp = Foo(token.substr(0,i));
this->leftExpression = temp;
Run Code Online (Sandbox Code Playgroud)

已经Foo声明为:

class Foo{
    private:
        std::string expr;
        std::vector <Bar*> tokens;
        std::vector <std::string> stringtoken;
Run Code Online (Sandbox Code Playgroud)

并且CCTOR调用循环:

Foo::Foo(const Foo& a_expr){
    this->expr = a_expr.expr;
    this->tokens = a_expr.tokens;
    this->stringtoken = a_expr.stringtoken;
}
Run Code Online (Sandbox Code Playgroud)

什么是调用这个循环?

编辑:

作业运营商:

Foo& Foo::operator=(const Foo& a_expr){
    Foo temp(a_expr);
    std::swap(*this, temp);
    return (*this);
}
Run Code Online (Sandbox Code Playgroud)

c++ copy-constructor

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

为什么MIPS汇编器有多个寄存器用于返回值?

我刚开始学习MIPS汇编程序,并意识到返回值有两个寄存器.

首先,我认为它是实现的,因为有些语言可能会返回多于一个值(但是然后将寄存器数量限制为2并没有多大意义).正如问答所暗示的那样,大多数现代编程语言只使用一个返回值,虽然强调"现代"这个词意味着过去有一些语言返回多个函数值,这就是MIPS有2个返回寄存器的原因,如果是的话,为什么只有2?

assembly mips

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

使用 opencv 进行特征检测失败并出现 seg 错误

我有以下代码

cv::initModule_nonfree();
std::vector<cv::KeyPoint> keypoints_1;
cv::Ptr<cv::FeatureDetector> detector = cv::FeatureDetector::create("SURF");
cv::Mat image = cv::imread("someFileNameHere",cv::IMREAD_COLOR);
// image.data is true, cv::imshow() dispalys the image
detector->detect(image, keypoints_1); // seg fault here
Run Code Online (Sandbox Code Playgroud)

段错误的原因可能是什么?我尝试在它上面运行 gdb,希望库有足够的元数据,但堆栈在调用detect()

c++ opencv feature-extraction feature-detection

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

运算符重载添加两个对象错误

我不知道为什么这个代码应该工作,但如果我想要将两个对象一起添加,请告诉我该怎么做.请.当你试图回答时请更专注于菜鸟

抱歉我的英语不好,我是印度人,这是我的代码.

#include<iostream>

using namespace std;

class time
{
private:
    int sec;
    int mint;
    int hours;
public:
    int Inputsec;
    int Inputmint;
    int Inputhours;
time(int Inputsec, int Inputmint, int Inputhours):sec(Inputsec), mint(Inputmint), hours(Inputhours){};
time operator+(time Inputobj)
{
    time blah (sec+Inputsec,mint+Inputmint,hours+Inputhours);
    return blah;
}

void DisplayCurrentTime()
{
    cout << "The Current Time Is"<<endl<< hours<<" hours"<<endl<<mint<<"minutes"<<endl<<sec<<"seconds"<<endl;
}
};

int main()
{
time now(11,13,3);
time after(13,31,11);
time then(now+after);
then.DisplayCurrentTime();
}
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但它给了我可怕的输出.我的错误在哪里?

c++ operator-overloading object

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

如何初始化对在单独文件中声明的类的引用?

class Foo{
    void operator=(const Foo&){};   
public:
    Foo(){};
};

Foo& fooRef(){
    static Foo aFoo;
    return aFoo;
}
int main() {
    Foo &foo = fooRef();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码正常工作,不会发出任何错误.一旦我将主体改为:

int main(){
    Foo &foo; 
    foo = fooRef();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器尝试使用operator=并因此抱怨.所以我的第一个问题是:它为什么会有所作为?

我来到这个事实的方式是我在做单元测试使用CPPunit,我一定要考有签名一个单独的类getInstance()Singleton& getInstance().为了进行测试,我试图在TestSingleton类中单例初始化一个实例.因此有:

class TestSingleton{
...
private:
    Singleton &instance;
};


void TestSingleton::setUp(){
    this->instance = Singleton::getInstance();
}
Run Code Online (Sandbox Code Playgroud)

以上示例发出错误(因为operator=声明为私有,如果不是,则很明显我不会被调用).所以第二个问题是:我如何避免这种情况并在我的TestSingleton班级中获得单身实例?

c++ singleton cppunit

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