1.内存释放问题
部分容器clear之后,其capacity还是不变的,并没有释放空间。这时候就需要用swap的trick或者C++11的shrink_to_fit来释放空间。具体需要释放空间的容器和注意的问题如下:
1)只有含 reserve()/capacity() 成员函数的容器才需要用swap的trick来释放空间,而 C++ 里只有 vector 和 string 这两个符合条件。在 C++11 中可以直接使用 shrink_to_fit(),这个比swap好,简单说就是更智能了,会考虑当前状态下容器的空间和目标所需空间来决定是否释放空间。
2)list/deque/set/map 等容器是没有 reserve() 和 capacity() 这两个成员函数的,因此 swap 是无用功(除非用户代码使用了定制的 per-object allocator)。
2.error: invalid use of non-static data member ’XXX’
翻译过来的意思非法访问了类里的某些成员变量。最后发现是作用域的问题。
例如我在Test.h中声明了函数:
std::unique_ptr<std::unordered_map<std::string,std::string>>& getMember();
在Test.cpp里实现该函数:
std::unique_ptr<std::unordered_map<std::string,std::string>>& getMember() {
return Test::ptr_of_Test; //报错 invalid use of non-static...
}
因为,编译器并不知道这个getMember是Test.h的,而且Test作用域里的ptr_of_Test又不是静态成员,所以报错。所以实现Test.h的函数时要声明函数作用域,正确如下:
std::unique_ptr<std::unordered_map<std::string,std::string>>& Test::getMember() {
//加上Test::
return Test::ptr_of_Test; //return ptr_of_Test;也可以,因为当前作用域已经指定
}
3.error: passing ‘const xxx’ as ‘this’ argument of xxx discards qualifiers [-fpermissive]|
例如以下代码:
#include <bits/stdc++.h>
using namespace std;
class Test {
public:
Test () {
}
map<int,int>& getmap() {
return Hash;
}
map<int,int>Hash;
};
void output(const Test& t){
auto& curHash = t.getmap(); //报错
cout << curHash.size() << endl;
}
int main() {
Test test;
output(test);
}
出现该问题的原因是因为我ouput的参数是一个const常量,尽管我t.getmap()得到的map我是只读,但编译器不知道。因此解决办法有3种:
1)将getmap函数申明为常量
#include <bits/stdc++.h>
using namespace std;
class Test {
public:
Test () {
}
map<int,int> getmap() const {
//将函数申明为常量
return Hash;
}
map<int,int>Hash;
};
void output(const Test& t){
map<int, int> curHash = t.getmap(); //但就实现不了变量引用
cout << curHash.size() << endl;
}
int main() {
Test test;
output(test);
}
2)不 要使用const参数或const_cast强制转换
使用非const参数是最方便的,但是我们又怕代码不小心改动了此参数,声明为const比较安全,且理论上效率更高。
#include <bits/stdc++.h>
using namespace std;
class Test {
public:
Test () {
}
map<int,int>& getmap() {
return Hash;
}
map<int,int>Hash;
};
void output(Test& t){
//使用非const参数
auto& curHash =