#include<iostream>
#include<vector>
#include<string>
using std::string;
using std::vector;
using std::cout;
using std::endl;
using std::cin;
void vector_test();
void practice_3_16();
void practice_3_20();
int main()
{
vector_test();
practice_3_16();
practice_3_20();
return 0;
}
//打印
void cout_vector(const vector<int> &pv)
{
for (auto c : pv)
cout << c << "-";
cout << endl;
}
void cout_vector_string(const vector<string> &pv)
{
for (auto c : pv)
cout << c << "-";
cout << endl;
}
void vector_test()
{
//标准库类型 vector 是类模板(class template),并不是类型,表示对象的集合,并且所有的对象类型都相同
//需要头文件 <vector>
//实例化(instantiation)时,编译器根据模板名后的尖括号内的类型生成类或函数,除引用外,大部分基本类型和类类型都可以构成 vector 对象,vector 对象也可以作为其元素
//常用初始化方式
vector<int> v1; //空容器
cout_vector(v1);
vector<int> v4(5, 9); //指定元素数量为 5,元素初始值为 9
cout_vector(v4);
vector<int> v2(v4); //将一个容器元素拷贝到另一个容器中,前提是2个容器内的元素类型相同
cout_vector(v2);
vector<int> v3 = v4; //同 v2
cout_vector(v3);
vector<int> v5(5); //指定元素数量为 5,但没有初始值,则创建一个值初始化(value initialized)的元素初值,并赋给所有元素,使用该方法要求1.只能使用()的直接初始化2.类元素不需要提供初始值
cout_vector(v5);
vector<int> v6{12,324,63,15,74,12}; //使用初始化列表为每个元素指定了初始值
cout_vector(v6);
vector<int> v7 = { 121, 324312, 6312, 151, 174, 12 }; //使用初始化列表为每个元素指定了初始值
cout_vector(v7);
vector<int> v8(v6.cbegin(), v6.cend()); //使用迭代器指定了一个范围
cout_vector(v8);
//上面的初始化过程,使用了几种不同的方式 ,= () {}
//除以下情况外,其他情况是可以互换初始化方式的
//1.拷贝初始化时,即使用 = ,只能提供一个初始值
//2.对于类内数据成员初始化,可以使用 = 的拷贝初始化和{}的列表初始化,但不能用(),无法与函数声明区分
//3.如果提供的是所有元素值的列表,只能使用{}的列表初始化,不能用(),无法与函数调用区分
//元素初始值还是初始个数,可以通过()或{}区分,()表示构造对象,{}表示用值列表来初始化对象,如果值无法初始化元素时,会考虑构造
vector<int> v9(5); //v9 含有5 个初始值为 0 的 int
cout_vector(v9);
vector<int> v10{5}; //v10 只有一个 int, 值为5
cout_vector(v10);
vector<int> v11(5, 7); //v9 含有5 个初始值为 7 的 int
cout_vector(v11);
vector<int> v12{5, 7}; //v9 含有2 个 int, 一个值为5, 一个值为 7
cout_vector(v12);
//vector<string> v13("hi"); //无法构建
vector<string> v14{ "hi" }; //1个元素,值为 "hi"
cout_vector_string(v14);
vector<string> v15(5); //5 个元素,都为空字符串
cout_vector_string(v15);
vector<string> v16{5}; //无法用 5 初始化元素,尝试使用构建,5 个元素,都为空字符串
cout_vector_string(v16);
vector<string> v17{ 5,"hi" }; //无法用 5 初始化元素,尝试使用构建,5 个元素,都为"hi"
cout_vector_string(v17);
//使用 push_back(n) 将 n 压入(push) vector 容器的尾端(back)
v17.push_back("xi");
cout_vector_string(v17);
//可以通过 vector<T>::size_type 类型的下标访问容器内的元素,但不能通过下标添加元素
decltype(v17.size()) x = 5;
cout << v17[5] << endl;
//v17[6] = "ga"; //运行时错误,越界访问不可预知的错误
}
//输入一组字符串,存入vector,然后转为大写输出
void practice_3_16()
{
string str;
vector<string> vs;
while (cin >> str)
if (!str.empty())
vs.push_back(str);
for (auto &s : vs)
{
for (auto &c : s)
c = toupper(c);
cout << s << endl;
}
}
//输入一组整数,计算2个相邻数的和,最后依次计算第一个和最后一个,第二个和倒数第二个 。。。的和
void practice_3_20()
{
int n;
vector<int> vi;
decltype(vi.size()) x = 0;
while (cin >> n)
{
vi.push_back(n);
//计算临值的和
x = vi.size();
if (x > 1)
{
cout << "sum:" << vi[x - 2] + vi[x - 1] << endl;
}
}
//依次计算第一个和最后一个,第二个和倒数第二个 。。。的和
x = vi.size();
if (x < 1)
{
cout << "too few num..." << endl;
return;
}
int j = 0, i = (x % 2) ? ((x - 1) / 2) : (x / 2);
cout << "x:" << x << "i:" << i << endl;
while (j != i)
{
cout << "sum1:" << vi[j] + vi[x - 1 - j] << endl;
++j;
}
}
c++ primer(第五版)笔记 第三章(2)vector 库初探
最新推荐文章于 2015-04-02 18:12:05 发布