C++基础tips

 

vector 的使用: 

特点:

vector是连续内存容器,换句话说,标准要求所有标准库实现的时候,vector中的元素的内存必须是连续的。所以对于插入和删除的时间复杂度是很高的,因为删除或者插入的时候,需要元素的移动,即元素复制拷贝。

使用原则:

  1. 尽量使用vector代替C风格的数组或者CArray;
  2. 尽量使用算法代替手工写的循环;
  3. 尽量使用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();

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值