C++笔记

记录C++中遇到的问题

关于auto

(1)auto

auto即 for(auto x:range) 这样会拷贝一份range元素,而不会改变range中元素;

但是!(重点) 使用for(auto x:vector)时得到一个proxy class,操作时会改变vector本身元素。应用:for(bool x:vector)

(2)auto&

当需要修改range中元素,用for(auto& x:range)

当vector返回临时对象,使用auto&会编译错误,临时对象不能绑在non-const l-value reference (左值引用)需使用auto&&,初始化右值时也可捕获

(3)const auto&

当只想读取range中元素时,使用const auto&,如:for(const auto&x:range),它不会进行拷贝,也不会修改range

(4)const auto

当需要拷贝元素,但不可修改拷贝出来的值时,使用 for(const auto x:range),避免拷贝开销.


当我们在遍历容器的时候

for(auto i : vec){
std::cout <<i <<std::endl;
}

但我知道这不必要的——不必要,因为我只需要打印 vec ——复制的值

编辑 : vec的每个元素,所以我可以这样做

for(auto &i : vec){
std::cout <<i <<std::endl;
}

但是我想确保 vec的值从未被修改并遵守 const-correctness,所以我可以:

for(const auto &i : vec){
std::cout <<i <<std::endl;
}

我的问题是:如果我只需要看看一些容器的值,不会最后循环( const auto &i ) 总是首选由于增加effieciency没有额外的副本(编辑 : vec的每个元素?

T//I'm copying this
T&//I'm modifying this
const T&//I'm reading this

这些是你的”默认值”。当 T 是基本类型( 内置) 时,你通常只需要恢复 const T ( 无引用),因为副本比别名更便宜。

对vector进行排序

源码:

#include <algorithm>
#include <vector>

vector<int> vec;
//比较函数,这里的元素类型要与vector存储的类型一致
bool compare(int a,int b)
{
return a<b; //升序排列
}

std::sort(vec.begin(),vec.end(),compare);

注意:由于sort()函数如果不声明比较函数就是默认升序,从小到大。

利用标准库函数find()对vector进行查找

vector<int> vec;
int a=10;
vector<int>::iterator it=find(vec.begin(),vector.end(),a);

构造类型在vector中的排序与查找

  将构造类型,比如struct的对象存储在vector中,查找时,需要重载等于运算符(operator==),具体实现参考如下代码。

struct Element {
public:
    int a;
    int b;

    Element(int a,int b){
        this->a = a;
        this->b = b;
    };

    bool operator == (const Element& ele){
        return a == ele.a && b == ele.b;
    };
};

//自定义比较函数
bool compare(const Element& left,const Element& right){
    return left.a < right.a; //升序排列
}

//重载输出操作符<<,格式化输出Element
ostream& operator << (ostream& coutU,const Element& ele){
    coutU << "a:" << ele.a << ",b:" << ele.b;
    return coutU;
}

int main() {
    vector<Element> vecEle;
    vecEle.push_back(Element(4,4));
    vecEle.push_back(Element(1,1));
    vecEle.push_back(Element(2,2));
    vecEle.push_back(Element(3,3));

    //sort
    std::sort(vecEle.begin(),vecEle.end(),compare);
    for(int i=0; i<vecEle.size(); ++ i) {
        cout << vecEle[i] << endl;
    }

    //查找Element(4,4)
    vector<Element>::iterator it = find(vecEle.begin(),vecEle.end(),Element(4,4));
    cout << "found " << *it << endl;
}

程序输出:
a:1,b:1
a:2,b:2
a:3,b:3
a:4,b:4
found a:4,b:4


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!