##实战c++中的vector系列--creating vector of local structure、vector of structs initialization
之前一直没有使用过`vector<struct>,现在就写一个简短的代码:
`
~~~
#include <vector>
#include <iostream>
int main() {
struct st { int a; };
std::vector<st> v;
v.resize(4);
for (std::vector<st>::size_type i = 0; i < v.size(); i++) {
v.operator[](i).a = i + 1; // v[i].a = i+1;
}
for (int i = 0; i < v.size(); i++)
{
std::cout << v[i].a << std::endl;
}
}
~~~
用VS2015编译成功,运行结果:
1
2
3
4
但是,这是C++11之后才允许的,之前编译器并不允许你写这样的语法,不允许vector容器内放local structure。
更进一步,如果struct里面有好几个字段呢?
~~~
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct subject {
string name;
int marks;
int credits;
};
int main() {
vector<subject> sub;
//Push back new subject created with default constructor.
sub.push_back(subject());
//Vector now has 1 element @ index 0, so modify it.
sub[0].name = "english";
//Add a new element if you want another:
sub.push_back(subject());
//Modify its name and marks.
sub[1].name = "math";
sub[1].marks = 90;
sub.push_back({ "Sport", 70, 0 });
sub.resize(8);
//sub.emplace_back("Sport", 70, 0 );
for (int i = 0; i < sub.size(); i++)
{
std::cout << sub[i].name << std::endl;
}
}
~~~
但是上面的做法不好,我们应该先构造对象,后进行push_back 也许更加明智。
subject subObj;
subObj.name = s1;
sub.push_back(subObj);
这个就牵扯到一个问题,为什么不使用emplace_back来替代push_back呢,这也是我们接下来讨论 话题。
- 前言
- 构造、operator=和assign区别
- 将迭代器转换为索引
- copy set to vector(别混淆了reserve和resize)
- 使用vector构造二维数组
- 可怕的迭代器失效(vector重新申请内存)
- 可怕的迭代器失效之二(删除vector中元素)
- vector<unique_ptr<>>初始化(所有权转移)
- vector<unique_ptr<>>作为函数的参数
- vector<unique_ptr<>>赋值给vector<unique_ptr<>>
- creating vector of local structure、vector of structs initialization
- 知道emplace_back为何优于push_back吗?
- emplace_back造成的引用失效
- vector的一些异常
- vector的遍历(stl算法、vector迭代器(不要在循环中判断不等于end())、operator[])
- 使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())
- vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)
- 使用sort算法对vector<unique_ptr<string>>进行排序(sort函数“应输入 2 个参数,却提供了 3 个)
- 对vector<自定义类>使用std::find 和 std::find_if 算法