C++ 知识补给(二)
本文声明:本文转载了多篇博客,每一篇博客的链接从上往下排序
转载地址 https://www.cnblogs.com/scandy-yuan/archive/2013/01/09/2853603.html
转载地址 https://blog.csdn.net/mangobar/article/details/81115449
转载地址 https://www.cnblogs.com/leaves1024/p/10245688.html
STL之deque容器详解
deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容。deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。
使用deque容器之前必须加上<deque>头文件:#include<deuqe>;
deque属于std命名域的内容,因此需要通过命名限定:using std::deque;也可以直接使用全局的命名空间方式:using namespace std;
构造函数
deque<Elem> c 创建一个空的deque
deque<Elem> c1(c2) 复制一个deque。
deque<Elem> c(n) 创建一个deque,含有n个数据,数据均已缺省构造产生。
deque<Elem> c(n, elem) 创建一个含有n个elem拷贝的deque。
deque<Elem> c(beg,end) 创建一个以[beg;end)区间的deque。
~deque<Elem>() 销毁所有数据,释放内存。
成员函数
c.begin()返回指向第一个元素的迭代器
c.end()返回指向最后一个元素下一个位置的迭代器
1 deque<int> d {1,2,3,4,5};
2 deque<int>::iterator it;
3 for(it=d.begin();it!=d.end();it++){
4 cout << *it << " ";
5 }
6 cout << endl;
c.rbegin()返回指向反向队列的第一个元素的迭代器(即原队列的最后一个元素)
c.rend()返回指向反向队列的最后一个元素的下一个位置(即原队列的第一个元素的前一个位置)
1 deque<int> d {1,2,3,4,5};
2 deque<int>::reverse_iterator it;
3 for(it=d.rbegin();it!=d.rend();it++){
4 cout << *it << " ";
5 }
6 cout << endl;
operator=赋值运算符重载
1 deque<int> d1 {1,2,3,4,5},d2;
2 d2 = d1;
3 deque<int>::iterator it;
4 for(it=d2.begin();it!=d2.end();it++){
5 cout << *it << " ";
6 }
7 cout << endl;
c.assign(n,num)将n个num拷贝复制到容器c
c.assign(beg,end)将[beg,end)区间的数据拷贝复制到容器c
1 deque<int> d1 {1,2,3,4,5},d2;2 d2.assign(2, 8);3 deque<int>::iterator it;4 cout << "d2.assign(n,num):";5 for(it=d2.begin();it!=d2.end();it++){6 cout << *it << " ";7 }8 d2.assign(d1.begin(), d1.begin()+3);9 cout << "d2.assign(beg,end):";
10 for(it=d2.begin();it!=d2.end();it++){
11 cout << *it << " ";
12 }
13 cout << endl;
c.at(pos)返回索引为pos的位置的元素,会执行边界检查,如果越界抛出out_of_range异常
1 deque<int> d {1,2,3,4,5};
2 cout << "d.at(pos):" << d.at(2);
3 return 0;
c.operator[]下标运算符重载
1 deque<int> d {1,2,3,4,5};
2 cout << "d[2]:" << d[2];
3 return 0;
c.empty()判断c容器是否为空
1 deque<int> d {1,2,3,4,5};
2 if(!d.empty()){
3 cout << "d is not empty!" << endl;
4 }else{
5 cout << "d is empty!" << endl;
6 }
7 return 0;
c.front()返回c容器的第一个元素
c.back()返回c容器的最后一个元素
1 deque<int> d {1,2,3,4,5};
2 if(!d.empty()){
3 cout << "d.front():" << d.front() << endl;
4 cout << "d.back(): " << d.back() << endl;
5 }
c.size()返回c容器中实际拥有的元素个数
1 deque<int> d {1,2,3,4,5};
2 cout << "d.size():" << d.size() << endl;
3 return 0;
c.max_size()返回c容器可能存放元素的最大数量
1 deque<int> d {1,2,3,4,5};
2 cout << "d.max_size():" << d.max_size() << endl;
3 return 0;
c.clear()清除c容器中拥有的所有元素
1 deque<int> d {1,2,3,4,5};2 deque<int>::iterator it;3 cout << "clear before:" ;4 for(it=d.begin();it!=d.end();it++){5 cout << *it << " ";6 }7 cout << endl;8 d.clear();9 cout << "clear after:" ;
10 for(it=d.begin();it!=d.end();it++){
11 cout << *it << " ";
12 }
13 cout << endl;
c.insert(pos,num)在pos位置插入元素num
c.insert(pos,n,num)在pos位置插入n个元素num
c.insert(pos,beg,end)在pos位置插入区间为[beg,end)的元素
1 deque<int> d {1,2,3,4,5};2 deque<int>::iterator it;3 cout << "insert before:" ;4 for(it=d.begin();it!=d.end();it++){5 cout << *it << " ";6 }7 cout << endl;8 d.insert(d.end(),22);9 d.insert(d.end(), 3,88);
10 int a[5] = {1,2,3,4,5};
11 d.insert(d.begin(),a,a+3);
12 cout << "insert after:" ;
13 for(it=d.begin();it!=d.end();it++){
14 cout << *it << " ";
15 }
16 cout << endl;
c.erase(pos)删除pos位置的元素c.erase(beg,end)删除区间为[beg,end)的元素
c.erase(beg,end)删除区间为[beg,end)之间的元素
1 deque<int> d {1,2,3,4,5};2 d.erase(d.begin());3 deque<int>::iterator it;4 cout << "erase(pos) after:" ;5 for(it=d.begin();it!=d.end();it++){6 cout << *it << " ";7 }8 cout << endl;9 d.erase(d.begin(), d.begin()+3);
10 cout << "erase(beg,end) after:" ;
11 for(it=d.begin();it!=d.end();it++){
12 cout << *it << " ";
13 }
14 cout << endl;
c.push_back(num)在末尾位置插入元素
c.pop_back()删除末尾位置的元素
c.push_front(num)在开头位置插入元素
c.pop_front()删除开头位置的元素
1 deque<int> d {1,2,3,4,5};2 d.push_back(10);3 deque<int>::iterator it;4 cout << "push_back(num):" ;5 for(it=d.begin();it!=d.end();it++){6 cout << *it << " ";7 }8 cout << endl;9
10 d.pop_back();
11 cout << "pop_back(num):" ;
12 for(it=d.begin();it!=d.end();it++){
13 cout << *it << " ";
14 }
15 cout << endl;
16
17 d.push_front(10);
18 cout << "push_front(num):" ;
19 for(it=d.begin();it!=d.end();it++){
20 cout << *it << " ";
21 }
22 cout << endl;
23
24 d.pop_front();
25 cout << "pop_front(num):" ;
26 for(it=d.begin();it!=d.end();it++){
27 cout << *it << " ";
28 }
29 cout << endl;
30 return 0;
c.resize(num)从新定义容器的大小
1 deque<int> d {1,2,3,4,5};2 cout << "d.size():" << d.size() << endl;3 d.resize(d.size()+5);4 cout << "d.resize() after:" << d.size() <<endl;5 deque<int>::iterator it;6 cout << "resize() after:" ;7 for(it=d.begin();it!=d.end();it++){8 cout << *it << " ";9 }
10 cout << endl;
c1.swap(c2)交换容器c1,c2;
swap(c1,c2)同上。
1 deque<int> d1 {1,2,3,4,5},d2,d3;2 d1.swap(d2);3 deque<int>::iterator it;4 cout << "d1 swap after:" ;5 for(it=d1.begin();it!=d1.end();it++){6 cout << *it << " ";7 }8 cout << endl;9 cout << "d2 swap after:" ;
10 for(it=d2.begin();it!=d2.end();it++){
11 cout << *it << " ";
12 }
13 cout << endl;
14
15 swap(d3,d2);
16 cout << "d3 swap after:" ;
17 for(it=d3.begin();it!=d3.end();it++){
18 cout << *it << " ";
19 }
20 cout << endl;
重载运算符
operator==
operator!=
operator<
operator<=
operator>
operator>=
迭代器
string对象或vector对象可以通过下标访问每一个元素,迭代器也具有同样的效果。那又有什么不同呢?事实上并不是所有的容器到可以使用下标访问每一个元素,即在容器上迭代器更具普适性。string类支持迭代器,同vector一样。
std::atomic
std::atomic对int, char, bool等数据结构进行原子性封装,在多线程环境中,对std::atomic对象的访问不会造成竞争-冒险。利用std::atomic可实现数据结构的无锁设计。
C++11给我们带来的Atomic一系列原子操作类,它们提供的方法能保证具有原子性。这些方法是不可再分的,获取这些变量的值时,永远获得修改前的值或修改后的值,不会获得修改过程中的中间数值。
std::vector简介及其使用
本文中的vector指的是std::vector C++11标准。
Vector概述
template <class T,class Alloc = allocator <T> > class vector; //通用模板
vector是表示可以改变大小的数组的序列容器。
就像数组一样,vector使用连续存储空间存储元素,这意味着它们的元素也可以使用指向其元素的指针进行偏移来访问,并与数组一样高效。但与数组不同的是, vector的大小可以动态变化,并且是由容器自动处理的。
在内部实现上,vector使用动态分配的数组来存储它们的元素。在插入新元素时,vector的大小增大,可能需要重新分配数组,这意味着可能要分配新数组并将原有数组中所有元素移动到这个新数组中。重新分配数组的时间成本相对高昂,因此,vector不会在每次向容器添加元素时都重新分配数组。vector容器可能会分配一些额外的存储空间来适应可能的增长,因此容器的实际容量可能比其包含的元素个数要大。不同库可以实现不同的增长策略以在使用现有内存和 重新分配内容之间取得平衡,但无论如何,重新分配内存时的数组大小应以对数增长,这样在vector末端插入单个元素时就可以得到平摊的常数时间复杂度。
因此,与数组相比,vector消耗更多内存,以换取以更有效的方式管理存储空间。
与其他动态序列容器(deques,lists和forward_lists)相比,vector可以非常高效地访问其元素(就像数组一样)并且相对高效地从其末尾添加或删除元素。 对于涉及在末尾以外的位置插入或删除元素的操作,性能比其他序列容器要差,并且与lists和forward_lists相比具有更少的迭代器和引用一致性。
容器属性
- 顺序存储
序列容器中的元素按照严格的线性顺序存储。各个元素通过使用它们在这个序列中的位置(index)来访问。
- 动态数组
允许直接访问序列中的任何元素,支持指针运算,相对快速的添加/删除序列末尾的元素。
- 分配器
容器使用allocator对象来动态处理其存储需求。
模板参数
- T
元素的类型。只有当 T 保证在移动操作时不会抛出异常,实现才会进行优化,即在重新分配数组时移动元素而不是复制它们。
别名为成员类型 vector :: value_type。
- Alloc
用于定义分配模型的分配器对象的类型。默认情况下,使用allocator类模板,该模板定义最简单的内存分配模型,并且与值无关。
别名为成员类型 vector :: allocator_type。
成员类型
member type | definition | notes |
---|---|---|
value_type | The first template parameter (T) | |
allocator_type | The second template parameter (Alloc) | defaults to: allocator<value_type> |
reference | value_type& | |
const_reference | const value_type& | |
pointer | allocator_traits<allocator_type>::pointer | for the default allocator: value_type* |
const_pointer | allocator_traits<allocator_type>::const_pointer | for the default allocator: const value_type* |
iterator | a random access iterator to value_type | convertible to const_iterator |
const_iterator | a random access iterator to const value_type | |
reverse_iterator | reverse_iterator<iterator> | |
const_reverse_iterator | reverse_iterator<const_iterator> | |
difference_type | a signed integral type, identical to: iterator_traits<iterator>::difference_type | usually the same as ptrdiff_t |
size_type | an unsigned integral type that can represent any non-negative value of difference_type | usually the same as size_t |
成员函数
- (constructor) 构造函数
default (1) |
|
---|---|
fill (2) |
|
range (3) |
|
copy (4) |
|
move (5) |
|
initializer list (6) |
|
构造函数示例:
// constructing vectors
#include <iostream>
#include <vector>int main ()
{// constructors used in the same order as described above:std::vector<int> first; // empty vector of intsstd::vector<int> second (4,100); // four ints with value 100std::vector<int> third (second.begin(),second.end()); // iterating through secondstd::vector<int> fourth (third); // a copy of third// the iterator constructor can also be used to construct from arrays:int myints[] = {16,2,77,29};std::vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );std::cout << "The contents of fifth are:";for (std::vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}Output:
The contents of fifth are: 16 2 77 29
- (destructor) 析构函数
~vector();
- operator= 赋值
copy (1) |
|
---|---|
move (2) |
|
initializer list (3) |
|
- 迭代器相关
函数 | 函数原型 | 功能描述 |
begin | iterator begin() noexcept; | Return iterator to beginning |
const_iterator begin() const noexcept; | ||
end | iterator end() noexcept; | Return iterator to end |
const_iterator end() const noexcept; | ||
rbegin | reverse_iterator rbegin() noexcept; | Return reverse iterator to reverse beginning |
const_reverse_iterator rbegin() const noexcept; | ||
rend | reverse_iterator rend() noexcept; | Return reverse iterator to reverse end |
const_reverse_iterator rend() const noexcept; | ||
cbegin | const_iterator cbegin() const noexcept; | Return const_iterator to beginning |
cend | const_iterator cend() const noexcept; | Return const_iterator to end |
crbegin | const_reverse_iterator crbegin() const noexcept; | Return const_reverse_iterator to reverse beginning |
crend | const_reverse_iterator crend() const noexcept; | Return const_reverse_iterator to reverse end |
迭代器示例:
// vector::begin/end
#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector;for (int i=1; i<=5; i++)myvector.push_back(i);std::cout << "myvector contains:";for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';return 0;
}Output:
myvector contains: 1 2 3 4 5
- 容器大小或容量相关
函数 | 函数原型 | 功能描述 |
size | size_type size() const noexcept; | Return size |
max_size | size_type max_size() const noexcept; | Return maximum size |
resize | void resize (size_type n); | Change size |
void resize (size_type n, const value_type& val); | ||
capacity | size_type capacity() const noexcept; | Return size of allocated storage capacity |
empty | bool empty() const noexcept; | Test whether vector is empty |
reserve | void reserve (size_type n); | Request a change in capacity |
shrink_to_fit | void shrink_to_fit(); | Shrink to fit |
示例:
// comparing size, capacity and max_size
#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector;// set some content in the vector:for (int i=0; i<100; i++)myvector.push_back(i);std::cout << "size: " << (int) myvector.size() << '\n';std::cout << "capacity: " << (int) myvector.capacity() << '\n';std::cout << "max_size: " << (int) myvector.max_size() << '\n';return 0;
}A possible output for this program could be:
size: 100
capacity: 128
max_size: 1073741823
- 成员访问相关
函数 | 函数原型 | 功能描述 |
operator[] | reference operator[] (size_type n); | Access element |
const_reference operator[] (size_type n) const; | ||
at | reference at (size_type n); | Access element |
const_reference at (size_type n) const; | ||
front | reference front(); | Access first element |
const_reference front() const; | ||
back | reference back(); | Access last element |
const_reference back() const; | ||
data | value_type* data() noexcept; | Access data. Return value: A pointer to the first element in the array used internally by the vector. |
const value_type* data() const noexcept; |
成员访问示例:
// vector::operator[]
#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector (10); // 10 zero-initialized elementsstd::vector<int>::size_type sz = myvector.size();// assign some values:for (unsigned i=0; i<sz; i++) myvector[i]=i;// reverse vector using operator[]:for (unsigned i=0; i<sz/2; i++){int temp;temp = myvector[sz-1-i];myvector[sz-1-i]=myvector[i];myvector[i]=temp;}std::cout << "myvector contains:";for (unsigned i=0; i<sz; i++)std::cout << ' ' << myvector[i];std::cout << '\n';return 0;
}Output:
myvector contains: 9 8 7 6 5 4 3 2 1 0
----------------------------------------------------------------------
// vector::at
#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector (10); // 10 zero-initialized ints// assign some values:for (unsigned i=0; i<myvector.size(); i++)myvector.at(i)=i;std::cout << "myvector contains:";for (unsigned i=0; i<myvector.size(); i++)std::cout << ' ' << myvector.at(i);std::cout << '\n';return 0;
}Output:
myvector contains: 0 1 2 3 4 5 6 7 8 9
----------------------------------------------------------------------
// vector::front
#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector;myvector.push_back(78);myvector.push_back(16);// now front equals 78, and back 16myvector.front() -= myvector.back();std::cout << "myvector.front() is now " << myvector.front() << '\n';return 0;
}Output:
myvector.front() is now 62
----------------------------------------------------------------------
// vector::back
#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector;myvector.push_back(10);while (myvector.back() != 0){myvector.push_back ( myvector.back() -1 );}std::cout << "myvector contains:";for (unsigned i=0; i<myvector.size() ; i++)std::cout << ' ' << myvector[i];std::cout << '\n';return 0;
}Output:
myvector contains: 10 9 8 7 6 5 4 3 2 1 0
----------------------------------------------------------------------
// vector::data
#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector (5);int* p = myvector.data();*p = 10;++p;*p = 20;p[2] = 100;std::cout << "myvector contains:";for (unsigned i=0; i<myvector.size(); ++i)std::cout << ' ' << myvector[i];std::cout << '\n';return 0;
}Output:
myvector contains: 10 20 0 100 0成员访问示例
- 添加、删除等修改相关操作
函数 | 函数原型 | 功能描述 |
assign |
template <class InputIterator> void assign (InputIterator first, InputIterator last); |
Assign vector content. Assigns new contents to the vector, replacing its current contents, and modifying its size accordingly. |
void assign (size_type n, const value_type& val); | ||
void assign (initializer_list<value_type> il); | ||
push_back | void push_back (const value_type& val); | Add element at the end |
void push_back (value_type&& val); | ||
pop_back | void pop_back(); | Delete last element |
insert | iterator insert (const_iterator position, const value_type& val); | Insert elements. Return value: An iterator that points to the first of the newly inserted elements. |
iterator insert (const_iterator position, size_type n, const value_type& val); | ||
template <class InputIterator> iterator insert (const_iterator position, InputIterator first, InputIterator last); |
||
iterator insert (const_iterator position, value_type&& val); | ||
iterator insert (const_iterator position, initializer_list<value_type> il); | ||
erase | iterator erase (const_iterator position); | Erase elements |
iterator erase (const_iterator first, const_iterator last); | ||
swap | void swap (vector& x); | Swap content |
clear | void clear() noexcept; | Clear content |
emplace |
template <class... Args> iterator emplace (const_iterator position, Args&&... args); |
Construct and insert element |
emplace_back |
template <class... Args> void emplace_back (Args&&... args); |
Construct and insert element at the end |
示例:
// vector assign
#include <iostream>
#include <vector>int main ()
{std::vector<int> first;std::vector<int> second;std::vector<int> third;first.assign (7,100); // 7 ints with a value of 100std::vector<int>::iterator it;it=first.begin()+1;second.assign (it,first.end()-1); // the 5 central values of firstint myints[] = {1776,7,4};third.assign (myints,myints+3); // assigning from array.std::cout << "Size of first: " << int (first.size()) << '\n';std::cout << "Size of second: " << int (second.size()) << '\n';std::cout << "Size of third: " << int (third.size()) << '\n';return 0;
}Output:
Size of first: 7
Size of second: 5
Size of third: 3
----------------------------------------------------------------------
// inserting into a vector
#include <iostream>
#include <vector>int main ()
{std::vector<int> myvector (3,100);std::vector<int>::iterator it;it = myvector.begin();it = myvector.insert ( it , 200 );myvector.insert (it,2,300);// "it" no longer valid, get a new one:it = myvector.begin();std::vector<int> anothervector (2,400);myvector.insert (it+2,anothervector.begin(),anothervector.end());int myarray [] = { 501,502,503 };myvector.insert (myvector.begin(), myarray, myarray+3);std::cout << "myvector contains:";for (it=myvector.begin(); it<myvector.end(); it++)std::cout << ' ' << *it;std::cout << '\n';return 0;
}Output:
myvector contains: 501 502 503 300 300 400 400 200 100 100 100
- Allocator相关
函数 | 函数原型 | 功能描述 |
get_allocator | allocator_type get_allocator() const noexcept; | Get allocator |
重载的非成员函数
函数 | 函数原型 | 功能描述 |
relational operators |
template <class T, class Alloc> bool operator== (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs); |
Relational operators for vector |
template <class T, class Alloc> bool operator!= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs); |
||
template <class T, class Alloc> bool operator< (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs); |
||
template <class T, class Alloc> bool operator<= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs); |
||
template <class T, class Alloc> bool operator> (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs); |
||
template <class T, class Alloc> bool operator>= (const vector<T,Alloc>& lhs, const vector<T,Alloc>& rhs); |
||
swap |
template <class T, class Alloc> void swap (vector<T,Alloc>& x, vector<T,Alloc>& y); |
Exchange contents of vectors |
特例
函数 | 函数原型 | 功能描述 |
vector<bool> |
template <class T, class Alloc = allocator<T> > class vector; // generic template template <class Alloc> class vector<bool,Alloc>; // bool specialization |
Vector of bool |
注:vector<bool>使用不慎可能会出问题,一般都建议不要使用。
C++ 知识补给(二)相关推荐
- BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的
BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的 原文:http://blog.csdn.net/qq445803843/article/details/46476433 这段代 ...
- Python基础数据之列表知识(二)
Python基础数据之列表知识(二) 一.列表的特点 二.列表的排序 三.列表的嵌套 1.嵌套的基本使用 2.嵌套的示例 四.列表的循环删除 五.列表相关知识链接 一.列表的特点 1.有序 2.独立 ...
- linux知识(二)互斥量、信号量和生产者消费者模型
linux知识(二)互斥量.信号量和生产者消费者模型 一.互斥量 产生原因 二.信号量 生产者消费者模型 一.互斥量 产生原因 使用多线程常常会碰到数据混乱的问题,那么使用互斥量,相当于"加 ...
- JavaScript知识(二)
JavaScript知识(二) 原文:JavaScript知识(二) 你要保守你心,胜过保守一切,因为一生的果效,是由心发出的.----O(∩_∩)O... ...O(∩_∩)O...老师因有事下午没 ...
- Android基础知识(二十):Notification、提醒式通知(横幅)踩坑与通知界面设置跳转
Android基础知识(二十):Notification.提醒式通知(横幅)踩坑与通知界面设置跳转 一.Notification通知与基本用法 通知Notification是Android系统中比较有 ...
- (硅谷课堂项目)Java开发笔记4:前端基础知识(二)
文章目录 (硅谷课堂项目)Java开发笔记4:前端基础知识(二) 一.NPM 1.NPM简介 1.1.什么是NPM 1.2.NPM工具的安装位置 2.使用npm管理项目 2.1.创建文件夹npm 2. ...
- 概率论基础知识(二) 随机变量及其分布
概率论基础知识(二) 随机变量及其分布 1.随机变量 定义:设随机试验的样本空间为S={e}, X=X(e)是定义在样本空间S上的实值单值函数.称X=X(e)为随机变量. 这样一来,样本空间可以很好的 ...
- web前端知识总结二(css(其他)+移动web网页开发)
web前端知识总结二(css(其他)+移动web网页开发) 文章目录 web前端知识总结二(css(其他)+移动web网页开发) 字体图标 平面转换-位移 位移:绝对定位居中 开门效果 旋转 转换原点 ...
- 计算广告基础知识(二)
计算广告基础知识(二) 刘鹏老师<计算广告:互联网商业变现的市场与技术>读书笔记 计算广告基础知识二 重点名词 合约广告 受众定向 流量预测traffic forecasting 流量塑形 ...
- 自知识蒸馏(知识蒸馏二)
自知识蒸馏(知识蒸馏二) 自知识蒸馏(知识蒸馏二) Born-Again Neural Networks(ICML2018) 方法 为什么有效 实验结果 Training Deep Neural Ne ...
最新文章
- SpringBoot 定时任务动态管理通用解决方案
- 怎么优雅的处理Java异常?
- adf4351_在ADF实体PK属性中使用MySQL自动增量PK列
- 计算机二级vfp模拟考试题,计算机等级考试二级VFP模拟练习题[10]
- RMAN SET NEWNAME
- 18 安装zlib报错_scalapack win安装及mingw64环境配置
- 用homebrew 升级安装python3.7 之后系统的python版本还是旧的怎么办
- linux下expect环境安装以及简单脚本测试
- 拓端tecdat|R语言泰坦尼克号随机森林模型案例数据分析
- 游戏 编程 语言 服务端 客户端 就业
- SE 2.4.0 patch机器码笔记
- 2021-6-26 激光的工业应用
- Flutter之导航栏骨架实现
- 心灵鸡汤——人生哲理
- uni-app ucharts无法显示
- 高通平台安卓手机开机
- RF:Robot命令行工具帮助文件中文译版(个人翻译)
- Element table各种合并单元格
- 浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
- Java基础 IP地址
热门文章
- DataHub: 现代数据栈的元数据平台的Metadata Ingestion Architecture【元数据摄取架构】讲解
- 目前有哪些高并发解决方案?
- 【软件分析/静态程序分析学习笔记】3.数据流分析(Data Flow Analysis) (上):可达性分析(Reaching Definitions)
- strut-控制器ActionServlet类详解
- 程序员应该学什么语言
- 优化计算机组策略,7种优化技巧优化Windows 10系统 提高电脑性能
- matlab画运动轨迹,Matlab画小球沿轨迹运动
- C语言中文网 读后感
- ONLYOFFICE权限开发之二
- hdu 6357 Hills And Valleys——dp