// vector1 stl 8.15.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。
//
//#include
//
//int main()
//{
// std::cout << “Hello World!\n”;
//}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
//#include
//#include
//using namespace std;
//int main()
//{
// // constructors used in the same order as described above:
// vector first; // empty vector of ints
// vector second(4, 100); // four ints with value 100
// vector third(second.begin(), second.end()); // iterating through second
// vector fourth(third); // a copy of third
// // 下面涉及迭代器初始化的部分,我们学习完迭代器再来看这部分
// // the iterator constructor can also be used to construct from arrays:
// int myints[] = { 16,2,77,29 };
// vector fifth(myints, myints + sizeof(myints) / sizeof(int));
// cout << “The contents of fifth are:”;
// for (std::vector::iterator it = fifth.begin(); it != fifth.end(); ++it)
// cout << ’ ’ << *it;
// cout << ‘\n’;
// return 0;
//}
//迭代器的获取
//#include
//#include
//using namespace std;
//int main()
//{
// //容器创建一个新的空的,这里使用的是默认的拷贝构造。
// vector myvector;
// //使用的是尾插进行的操作。直接使用的是现成的接口。
// for (int i = 1; i <= 5; i++)
// {
// myvector.push_back(i);
// }
// cout << “myvector contains:”;
// //迭代器的获取,注意书写的形式。
// for (vector::iterator it = myvector.begin(); it != myvector.end(); ++it)
// {
// //这里是非const类型的操作,就是可以对齐进行内容的修改。
// //*it = 1;
// cout << ’ ’ << *it;
// }
// // cout << ’ ’ << *it;
// cout << ‘\n’;
// return 0;
//}
//#include
//#include
//
//int main()
//{
// std::vector myvector;
// int sum(0);
// for (int i = 1; i <= 10; i++) myvector.push_back(i);
// while (!myvector.empty())
// {
// //这里是表示的是每次从最后一个位置加,加完之后删除。
// sum += myvector.back();
// myvector.pop_back();
// }
// std::cout << "total: " << sum << ‘\n’;
// return 0;
//}
//#include
//#include
//using namespace std;
const 对象的输出打印。
//void PrintVector(const vector& v)
//{
// // const对象使用const迭代器进行遍历打印
// vector::const_iterator it = v.begin();
// while (it != v.end())
// {
// cout << *it << " ";
// ++it;
// }
// cout << endl;
//}
//int main()
//{
// // 使用push_back插入4个数据
// vector v;
// v.push_back(1);
// v.push_back(2);
// v.push_back(3);
// v.push_back(4);
// // 使用迭代器进行遍历打印
// vector::iterator it = v.begin();
// while (it != v.end())
// {
// cout << *it << " ";
// ++it;
// }
// cout << endl;
// // 使用迭代器进行修改
// it = v.begin();
// while (it != v.end())
// {
// *it *= 2;
// ++it;
// }
// // 使用反向迭代器进行遍历再打印
// vector::reverse_iterator rit = v.rbegin();
// while (rit != v.rend())
// {
// cout << *rit << " ";
// ++rit;
// }
// cout << endl;
// PrintVector(v);
// return 0;
//}
#include
#include
using namespace std;
//assign 赋值的内容
vector v;
void test()
{
vector v(3,2);
//赋值
v.assign(5,1);
printF(v);
vector v2(3, 6);
v.assign(v2.begin(), v2.end());
printF(v);
int arr[] = { 1,2,3,4 };
v.assign(arr, arr + sizeof(arr) / sizeof(arr[0]));
printF(v);
//未删
popback();
//插入的操作
v.insert(v.begin(), 0);
//删除
//删除 一个字符
//删除一个区间 左闭右开
//emplace 这里也是插入的操作,但是区别就是可以自己创建一个对象。
//优势主要是体现在自定义的类型
//emplace与insert的区别
//swap 交换相同的类型
vector<A> v3;
v3.swap(v2);
swap(v3, v2);
//清空的操作
v2.clear();
}
//迭代器失效的操作
//迭代器失效的场景 使空间发生变化的,都有可能使我们的迭代器失效。
//失效的原因就是因为,当空间发生变化的时候,迭代器的指向发生了变化,就是可能丢弃之前的空间,而指向新的空间
//1.迭代器指向的位置无效,空间释放(非法访问)
//2.指向发生了变化(错位)
//3.空间发生变化或者删除,都会引起迭代器的失效
void test1()
{
vector v(3, 0);
vector::iterator it = v.begin();
cout << *it << endl;
v.resize(30, 1);
v.reserve(30);
v.insert(v.begin(), 1);
v.push_back(2);
v.emplace(v.begin(), 3);
v.erase(it);
//解决方式:重新获取迭代器
it = v.begin();
cout << *it << endl;
}
//
void test()
{
vector v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
v.erase(it);
++it;
}
}
//题目. 只出现一次的数字
class Solution {
public:
int singleNumber(vector& nums)
{
int value = 0;
for (auto e : v)
{
value ^= e;
}
return value;
}
};
//杨辉三角
// 涉及resize / operator[]
class Solution {
public:
// 核心思想:找出杨辉三角的规律,发现每一行头尾都是1,中间第[j]个数等于上一行[j-1]+[j]
//首先是开行
vector<vector> generate(int numRows)
{
//再就是列的空间的开辟。
vector<vector> vv;
// 先开辟杨辉三角的空间
vv.resize(numRows);
for (size_t i = 1; i <= numRows; ++i)
{
vv[i - 1].resize(i, 0);
// 每一行的第一个和最后一个都是1
vv[i - 1][0] = 1;
vv[i - 1][i - 1] = 1;
}
for (size_t i = 0; i < vv.size(); ++i)
{
for (size_t j = 0; j < vv[i].size(); ++j)
{
if (vv[i][j] == 0)
{
vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j];
}
}
}
return vv;
}
};
//周老师
vector<vector> generate(int numRows)
//创建行 行数是题目给出的。
vector<vector> mat(numRows);
//创建列
for (int i = 0; i < numRows; ++i)
{
mat[i].resize(i + 1);
}
for (int i = 0; i < numRows; ++i)
{
//第一行和第一列为1
mat[i][0] = mat[i][i] = 1;
for (int j = 1; j < i; ++j)
{
mat[i][j] = mat[i - 1][j] + mat[i - 1][j - 1];
}
return mat;
}