Bah*_*dil 6 c++ vector copy-constructor
我想知道为什么在下面的C++代码中,复制构造函数被调用25次10次迭代?
如果它是10那么好10/10 = 1,或者20/10 = 2,或者30/10 = 3,但是25/10 = 2.5?这.5意味着什么?
标题:
class Person
{
public:
Person(std::string name, int age);
Person(const Person &person);
const std::string &getName() const;
int getAge() const;
private:
std::string name;
int age;
};
Run Code Online (Sandbox Code Playgroud)
资源:
Person::Person(string name, int age) : name(std::move(name)), age(age)
{}
Person::Person(const Person &person)
{
this->name = person.name;
this->age = person.age;
static int count = 0;
count++;
cout << ">>Copy-Person::Person(Person &person) " << count << endl;
}
const string &Person::getName() const
{
return name;
}
int Person::getAge() const
{
return age;
}
Run Code Online (Sandbox Code Playgroud)
用法:
int main()
{
vector<Person> persons;
for (int i = 0; i < 10; ++i)
{
Person person(to_string(i + 1), i);
persons.push_back(person);
}
cout << "-----------------------------------------------" << endl;
for (Person &person : persons)
{
cout << "name = " << person.getName() << " age = " << person.getAge() << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
>>Copy-Person::Person(Person &person) 1
>>Copy-Person::Person(Person &person) 2
>>Copy-Person::Person(Person &person) 3
>>Copy-Person::Person(Person &person) 4
>>Copy-Person::Person(Person &person) 5
>>Copy-Person::Person(Person &person) 6
>>Copy-Person::Person(Person &person) 7
>>Copy-Person::Person(Person &person) 8
>>Copy-Person::Person(Person &person) 9
>>Copy-Person::Person(Person &person) 10
>>Copy-Person::Person(Person &person) 11
>>Copy-Person::Person(Person &person) 12
>>Copy-Person::Person(Person &person) 13
>>Copy-Person::Person(Person &person) 14
>>Copy-Person::Person(Person &person) 15
>>Copy-Person::Person(Person &person) 16
>>Copy-Person::Person(Person &person) 17
>>Copy-Person::Person(Person &person) 18
>>Copy-Person::Person(Person &person) 19
>>Copy-Person::Person(Person &person) 20
>>Copy-Person::Person(Person &person) 21
>>Copy-Person::Person(Person &person) 22
>>Copy-Person::Person(Person &person) 23
>>Copy-Person::Person(Person &person) 24
>>Copy-Person::Person(Person &person) 25
-----------------------------------------------
name = 1 age = 0
name = 2 age = 1
name = 3 age = 2
name = 4 age = 3
name = 5 age = 4
name = 6 age = 5
name = 7 age = 6
name = 8 age = 7
name = 9 age = 8
name = 10 age = 9
Run Code Online (Sandbox Code Playgroud)
您没有为persons向量保留任何内存。这意味着在persons.size() == persons.capacity()a 期间push_back,向量将在堆上分配一个新的更大的缓冲区并将每个元素复制到其中。这就是为什么您看到的副本比预期多的原因。
如果你写...
persons.reserve(10);
Run Code Online (Sandbox Code Playgroud)
...在循环之前,您不会看到任何“额外”副本。
std::vector::emplace_back请注意,您可以通过使用和来完全避免副本std::vector::reserve:
for (int i = 0; i < 10; ++i)
{
persons.emplace_back(to_string(i + 1), i);
}
Run Code Online (Sandbox Code Playgroud)
这只会打印:
姓名 = 1 年龄 = 0
姓名 = 2 年龄 = 1
姓名 = 3 年龄 = 2
姓名 = 4 年龄 = 3
姓名 = 5 年龄 = 4
姓名 = 6 年龄 = 5
姓名 = 7 年龄 = 6
姓名 = 8 年龄 = 7
姓名 = 9 年龄 = 8
姓名 = 10 年龄 = 9