#include <iostream>
#include <vector>
class Vec {
std::vector<double> mData;
int mSize;
public:
Vec(int size) : mData(std::vector<double>(size,0)), mSize(size) {
std::cout << "constructed" << std::endl;
}
double& operator[](int i) {return mData[i];}
double operator[](int i) const {return mData[i];}
Vec choose(const Vec& ifPositive, const Vec& ifNegative) const;
Vec& setNegative(Vec& target, const Vec& ifNegative) const;
};
Vec Vec::choose(const Vec& ifPositive, const Vec& ifNegative) const {
Vec out(mSize);
for(int index = 0; index < mSize; ++index) {
if(mData[index] > 0)
out[index] = ifPositive[index];
else
out[index] = ifNegative[index];
}
return out;
}
Vec& Vec::setNegative(Vec& target, const Vec& ifNegative) const {
for(int index = 0; index < mSize; ++index) {
if(mData[index] <= 0)
target[index] = ifNegative[index];
}
return target;
}
int main() {
const int size = 100;
Vec trigger(size); // 1. constructor
for(int i = 0; i < size; ++i) {
if(i < size/2)
trigger[i] = -1;
else
trigger[i] = 1;
}
Vec valA(size), valB(size); // 2. & 3. constructor
for(int i = 0; i < size; ++i) {
valA[i] = 1;
valB[i] = 2;
}
valA = trigger.choose(valA, valB); // 4. constructor -> not necessary, see next line
valA = trigger.setNegative(valA, valB); // no constructor
Vec valC = trigger.choose(valA, valB); // 5. constructor -> okay
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgVmVjIHsKICBzdGQ6OnZlY3Rvcjxkb3VibGU+IG1EYXRhOwogIGludCBtU2l6ZTsKcHVibGljOgogIFZlYyhpbnQgc2l6ZSkgOiBtRGF0YShzdGQ6OnZlY3Rvcjxkb3VibGU+KHNpemUsMCkpLCBtU2l6ZShzaXplKSB7IAogICAgICBzdGQ6OmNvdXQgPDwgImNvbnN0cnVjdGVkIiA8PCBzdGQ6OmVuZGw7CiAgfQogIGRvdWJsZSYgb3BlcmF0b3JbXShpbnQgaSkge3JldHVybiBtRGF0YVtpXTt9CiAgZG91YmxlIG9wZXJhdG9yW10oaW50IGkpIGNvbnN0IHtyZXR1cm4gbURhdGFbaV07fQogIFZlYyBjaG9vc2UoY29uc3QgVmVjJiBpZlBvc2l0aXZlLCBjb25zdCBWZWMmIGlmTmVnYXRpdmUpIGNvbnN0OwogIFZlYyYgc2V0TmVnYXRpdmUoVmVjJiB0YXJnZXQsIGNvbnN0IFZlYyYgaWZOZWdhdGl2ZSkgY29uc3Q7Cn07CgpWZWMgVmVjOjpjaG9vc2UoY29uc3QgVmVjJiBpZlBvc2l0aXZlLCBjb25zdCBWZWMmIGlmTmVnYXRpdmUpIGNvbnN0IHsKICAgIFZlYyBvdXQobVNpemUpOwogICAgZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgbVNpemU7ICsraW5kZXgpIHsKICAgICAgICBpZihtRGF0YVtpbmRleF0gPiAwKQogICAgICAgICAgICBvdXRbaW5kZXhdID0gaWZQb3NpdGl2ZVtpbmRleF07CiAgICAgICAgZWxzZQogICAgICAgICAgICBvdXRbaW5kZXhdID0gaWZOZWdhdGl2ZVtpbmRleF07CiAgICB9CiAgICByZXR1cm4gb3V0Owp9CgpWZWMmIFZlYzo6c2V0TmVnYXRpdmUoVmVjJiB0YXJnZXQsIGNvbnN0IFZlYyYgaWZOZWdhdGl2ZSkgY29uc3QgewogICAgZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgbVNpemU7ICsraW5kZXgpIHsKICAgICAgICBpZihtRGF0YVtpbmRleF0gPD0gMCkKICAgICAgICAgICAgdGFyZ2V0W2luZGV4XSA9IGlmTmVnYXRpdmVbaW5kZXhdOwogICAgfQogICAgcmV0dXJuIHRhcmdldDsKfQoKaW50IG1haW4oKSB7CiAgICBjb25zdCBpbnQgc2l6ZSA9IDEwMDsKICAgIAogICAgVmVjIHRyaWdnZXIoc2l6ZSk7IC8vIDEuIGNvbnN0cnVjdG9yCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CiAgICAgICAgaWYoaSA8IHNpemUvMikKICAgICAgICAgICAgdHJpZ2dlcltpXSA9IC0xOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdHJpZ2dlcltpXSA9IDE7CiAgICB9CiAgICAKICAgIFZlYyB2YWxBKHNpemUpLCB2YWxCKHNpemUpOyAvLyAyLiAmIDMuIGNvbnN0cnVjdG9yCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CiAgICAgICAgdmFsQVtpXSA9IDE7CiAgICAgICAgdmFsQltpXSA9IDI7CiAgICB9CiAgICAKICAgIHZhbEEgPSB0cmlnZ2VyLmNob29zZSh2YWxBLCB2YWxCKTsgLy8gNC4gY29uc3RydWN0b3IgLT4gbm90IG5lY2Vzc2FyeSwgc2VlIG5leHQgbGluZQogICAgdmFsQSA9IHRyaWdnZXIuc2V0TmVnYXRpdmUodmFsQSwgdmFsQik7IC8vIG5vIGNvbnN0cnVjdG9yCiAgICAKICAgIFZlYyB2YWxDID0gdHJpZ2dlci5jaG9vc2UodmFsQSwgdmFsQik7IC8vIDUuIGNvbnN0cnVjdG9yIC0+IG9rYXkKICAgIAp9