vector 的使用:
特点:
vector是连续内存容器,换句话说,标准要求所有标准库实现的时候,vector中的元素的内存必须是连续的。所以对于插入和删除的时间复杂度是很高的,因为删除或者插入的时候,需要元素的移动,即元素复制拷贝。
使用原则:
- 尽量使用vector代替C风格的数组或者CArray;
- 尽量使用算法代替手工写的循环;
- 尽量使用vector本身的函数代替其他泛型算法
初始化:
1,填充vector
如果我们想用原始数组的内容填充vector,那么于有很多种方式。我们来一次学习vector的几个方法。
例如我们有数组int v1[10] = {0,1,0,0,3,0,0,4,4,4};
vector<int> v2(10); //初始化size为10可以避免数组动态增长的时候不断的分配内存
//v2.reserve(10);//同上,只要使用其中一个就可以了
for( int i=0; i<10; i++ )
{
v2.push_back(v1[i]);
}
初始化方式2:
vector<int> v3(&v1[0],&v1[9]);//原始数组的元素指针可以作为迭代器来使用
初始化方式3:
vector<int> v4;
v4.reserve(10);
v4.insert(v4.begin(), &v1[0], &v[9]);
初始化方式4:
vector<int> v5(10);
copy(v5.begin(), &v1[0], &v1[9]);
原始数组的元素指针可以作为迭代器来使用。
原则:尽量使用reserve来减少不必要的内存分配次数。
原则:尽量使用empty而不是size()==0 来判断容器是否为空
有可能我们需要在vector中插入相应的元素
vector<int>::iterator i = find( v1.begin(), v1.end(), 3);
if( i != v1.end() )
{
v1.insert( i, 6 );
}
可以使用sort()进行排序
sort(nums.begin(), nums.end());//要使用迭代器的方式
模板举例:
template <typename T>
void display_vector(vector<T>& vector_){
//一定要添加typename关键字来说明这里的T是代表类型,而不是数据
for (typename vector<T>::iterator it=vector_.begin(); it != vector_.end(); it++){
cout << *it<< " ";
}
cout << endl;
}
参考:https://blog.csdn.net/zhyh1435589631/article/details/62236363
在c++模板中,使用std::vector::const_iterator时,编译器假定这样的名字指定的是数据成员,而不是数据类型成员,如果需要指定为数据类型成员需要使用 typename 关键字
随机初始化一个vector
template <typename T>
vector<T> getRandomVector(int n, T range){
vector<T> re;
unsigned seed = (unsigned)time(NULL);
srand(seed);
typename vector<T>::iterator iter=re.end();
for (int i=0; i<n; i++){
re.insert(iter, (T)rand()%range);
iter = re.end();
}
return re;
}
上面的用了迭代器, 看起来高端, 反而比较慢. 不如下面这个
template <typename T>
vector<T> getRandomVector(int n, T range){
vector<T> re(n);
unsigned seed = (unsigned)time(NULL);
srand(seed);
typename vector<T>::iterator iter=re.end();
for (int i=0; i<n; i++){
re.push_back((T)rand()%range);
}
return re;
}
C++队列queue模板类
的定义在<queue>头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的。C++队列queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。
C++队列Queue类成员函数如下:
back()返回最后一个元素
empty()如果队列空则返回真
front()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数
Queue 的基本操作举例如下:
queue入队,如例:q.push(x);将x 接到队列的末端。
queue出队,如例:q.pop();弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问queue队首元素,如例:q.front(),即最早被压入队列的元素。
访问queue队尾元素,如例:q.back(),即最后被压入队列的元素。
判断queue队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()。
C++中的queue自身是不支持clear操作的,但是双端队列deque是支持clear操作的。
方法一
直接用空的队列对象赋值
queue<int> q1;
// process
// ...
q1 = queue<int>();
方法二
遍历出队列
while (!Q.empty()) Q.pop();
方法三
void clear(queue<int>& q) {
queue<int> empty;
swap(empty, q);
}
string
进行比较全面 : https://blog.csdn.net/tao_627/article/details/53585899
https://blog.csdn.net/tao_627/article/details/53585899
v.erase(unique(v.begin(), v.end()), v.end()); //unique()函数将重复的元素放到vector的尾部 然后返回指向第一个重复元素的迭代器 再用erase函数擦除从这个元素到最后元素的所有的元素
c++ 读取txt文件
#include <boost/algorithm/string.hpp>
#include <boost/filesystem.hpp>
std::ifstream record(data_recordtxt);
while (!record.eof()) {
std::string fold_info = "123";
std::getline(record, fold_info);
cout<< "fold_info : " <<fold_info<< endl;
}
record.close();
// write txt file
std::ofstream f(savePath+"/cutVideo.txt", std::ios::app); // app means add new line;
f << temp << std::endl;
f.close();