C++笔记
记录C++中遇到的问题
关于auto
(1)auto
auto即 for(auto x:range) 这样会拷贝一份range元素,而不会改变range中元素;
但是!(重点) 使用for(auto x:vector
(2)auto&
当需要修改range中元素,用for(auto& x:range)
当vector
(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 协议 ,转载请注明出处!