先看代码
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int main()
{
vector<int> nums;
vector<vector<int>> nums1;
nums.reserve(6);
nums.push_back(10);
nums.push_back(20);
nums.push_back(30);
nums.emplace_back(100);
nums.emplace_back(200);
nums.emplace_back(300);
nums1.emplace_back(nums);
for (int num : nums)
{
std::cout << num << " ";
}
std::cout << endl;
string greeting = "hello";
greeting.push_back('!');
for (char greet : greeting)
{
std::cout << greet << " ";
}
std::cout << endl;
std::system("pause");
}
各容器支持情况
push_back
- 在容器末尾添加元素
- 接受已构造的对象(拷贝或移动)
- 适用于所有序列容器(vector, deque, list, string)
std::vector<std::string> vec;
std::string str = "hello";
vec.push_back(str); // 拷贝构造
vec.push_back(std::move(str)); // 移动构造
vec.push_back("world"); // 构造临时对象后移动
std::vector<int> vec;
vec.push_back(42); // 1. 创建临时int(42) → 2. 移动或拷贝到容器
emplace_back (C++11)
- 在容器末尾直接构造元素
- 接受构造参数而非完整对象
- 避免临时对象创建,更高效
- 返回新构造元素的引用 (C++17起)
std::vector<std::string> vec;
vec.emplace_back("hello"); // 直接构造,无临时对象
vec.emplace_back(5, 'a'); // 构造 std::string(5, 'a')
class Person {
public:
Person(std::string n, int a) : name(n), age(a) {}
private:
std::string name;
int age;
};
std::vector<Person> people;
people.emplace_back("Alice", 30); // 直接构造Person对象
std::vector<int> vec;
vec.emplace_back(42); // 直接在容器内存构造int(42)