vendredi 1 avril 2016

which range loop(auto, auto&, const auto&) is more efficient in c++11

// Example program
#include <iostream>
#include <ostream>
#include <string>
#include <vector>

class One
{
public:
    One(int age, int price)
        : m_age(age), m_price(price)
    {
        std::cout << "m_age: " << m_age << " , m_price: " << m_price << std::endl;    
    }
    One(const One&) = default;
    One& operator=(const One&) = default;

    int age() const { return m_age; }
    int price() const { return m_price; }

private:
    int m_age;
    int m_price;    
};

std::ostream& operator<<(std::ostream& os, const One& one)
{
    os << "<< m_age: " << one.age() << " , m_price: " << one.price();
    return os;    
}

int main()
{
    std::vector<One> vecOnes = {{1, 2}, {3, 4}};

    //for(auto it: vecOnes)                // case I
    //for(auto& it: vecOnes)         // case II
    for(const auto& it: vecOnes)           // case III
    {
        std::cout << it << std::endl;
    }
}

All three cases output the same results as follows:

m_age: 1 , m_price: 2
m_age: 3 , m_price: 4
<< m_age: 1 , m_price: 2
<< m_age: 3 , m_price: 4

Question> which case is more efficient way to use auto? Originally, I expect the auto will trigger the constructor of class One. But it doesn't show that way based on the output results.

Thank you

Aucun commentaire:

Enregistrer un commentaire