Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中,哪个范围循环(auto、auto&;、const auto&;)更有效+;11 //示例程序 #包括 #包括 #包括 #包括 一班 { 公众: 一(整数年龄,整数价格) :m_年龄(年龄),m_价格(价格) { 标准::cout_C++_C++11 - Fatal编程技术网

C++ 在c+中,哪个范围循环(auto、auto&;、const auto&;)更有效+;11 //示例程序 #包括 #包括 #包括 #包括 一班 { 公众: 一(整数年龄,整数价格) :m_年龄(年龄),m_价格(价格) { 标准::cout

C++ 在c+中,哪个范围循环(auto、auto&;、const auto&;)更有效+;11 //示例程序 #包括 #包括 #包括 #包括 一班 { 公众: 一(整数年龄,整数价格) :m_年龄(年龄),m_价格(价格) { 标准::cout,c++,c++11,C++,C++11,最初,我希望auto会触发类1的构造函数,但根据输出结果,它不会这样显示 它确实触发了一个构造函数:复制构造函数。但您没有插入该构造函数†,因此您看不到任何输出。另外两种情况不会构造新对象,因此肯定会更有效 请注意,(auto&&it:vecOnes){…}还有第四种情况,它与第二种情况相同,也不会创建任何新对象 †现在您编辑了您的问题,应该很清楚,一种情况确实构建了新对象,而其他情况都没有 最初,我希望auto会触发类1的构造函数,但根据输出结果,它不会这样显示 它确实触发了一个构造函数:复制

最初,我希望auto会触发类1的构造函数,但根据输出结果,它不会这样显示

它确实触发了一个构造函数:复制构造函数。但您没有插入该构造函数†,因此您看不到任何输出。另外两种情况不会构造新对象,因此肯定会更有效

请注意,(auto&&it:vecOnes){…}还有第四种情况
,它与第二种情况相同,也不会创建任何新对象

†现在您编辑了您的问题,应该很清楚,一种情况确实构建了新对象,而其他情况都没有

最初,我希望auto会触发类1的构造函数,但根据输出结果,它不会这样显示

它确实触发了一个构造函数:复制构造函数。但您没有插入该构造函数†,因此您看不到任何输出。另外两种情况不会构造新对象,因此肯定会更有效

请注意,(auto&&it:vecOnes){…}
还有第四种情况
,它与第二种情况相同,也不会创建任何新对象


†现在您编辑了您的问题,应该很清楚,一种情况确实构建了新对象,而其他情况都没有。

事实是,这取决于

如果您刚刚得到一个内置类型的向量,例如
int
,那么您最好使用
auto-it
,因为复制成本很低,并且每次使用该值时都会保存一个解引用。对于类,这将调用复制构造函数,这可能会影响性能


但是,如果你认为vector包含一个类,那么一般来说,使用
auto&it
const auto&it
来节省创建对象副本的时间会更有效。与非
const
相比,使用
const
没有成本优势,这取决于你想如何与对象交互。

事实是,这取决于

如果您刚刚得到一个内置类型的向量,例如
int
,那么您最好使用
auto-it
,因为复制成本很低,并且每次使用该值时都会保存一个解引用。对于类,这将调用复制构造函数,这可能会影响性能


但是,如果你认为vector包含一个类,那么一般来说,使用
auto&it
const auto&it
来节省创建对象副本的时间会更有效。与非
const
相比,使用
const
没有成本优势,这取决于你想如何与对象交互。

我希望auto会触发类1的构造函数。但它不会根据输出结果显示这种方式。
您的类有两个构造函数,但您只检测了一个。调用的是另一个构造函数,即复制构造函数,它不会生成任何输出。如果您想看到它,请将其实现为打印n操作。@IgorTandetnik,谢谢您的评论。@Igor答案属于回答。我回滚了您的编辑。请不要将答案编辑到您的问题中。
我希望自动将触发类1的构造函数。但它不会根据输出结果显示这种方式。
您的类有两个构造函数,但您只插入了指令一个。它是另一个被调用的复制构造函数,它不会产生任何输出。如果您想看到它在运行,请实现它来打印一些内容。@igortandtnik,谢谢您的评论。@Igor答案属于回答。我回滚了您的编辑。请不要将答案编辑到您的问题中。
// 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;
    }
}
m_age: 1 , m_price: 2
m_age: 3 , m_price: 4
<< m_age: 1 , m_price: 2
<< m_age: 3 , m_price: 4