Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

2019-9月7号C++编程笔记

2019/11/26 编程笔记
Word count: 733 | Reading time: 4min

2019-9月7号C++编程笔记

auto

定义变量时放在变量前,无需知道具体变量类型,系统可自行推断类型,减少编程工作,特别是在模板使用时,使用更方便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
auto a=1;
auto b='a';
auto s="abdc";
auto c;//这样使用时错误的,系统无法自动推断出变量类型
//下面为迭代指针使用,很方便
vector<int> vec;
auto it=vec.begin();

/**
模板使用案例
*/
template<typename InputIterator>
TreeNode *creatTree(InputIterator in_beg,InputIterator in_end...)
{
.....
auto inRootPos=find(in_beg,in_end,val);
......
}

std::next

1
2
3
// Defined in header <iterator>
template< class ForwardIt >
ForwardIt next( ForwardIt it, typename std::iterator_traits<ForwardIt>::difference_type n = 1 );
  • Parameters:

    • it – 迭代指针
    • n – 向前进的元素个数,缺省默认为1
  • Return value

    The nth successor of iterator it.(返回it的第n个后继迭代指针)

1
2
3
4
for (int i = 0; i < vals.size(); ++i) {
// *std::next(vals.cbegin(), i)遍历set的所有值,每次取出一个val
// count为计算values中包含val的个数
int count = std::count(values.cbegin(), values.cend(), *std::next(vals.cbegin(), i));

std::prev

1
2
3
// 使用方法与next相似,不同的是prev返回的是it的第n个前驱迭代指针,即返回指针是begin()和rbegin()区别
template< class BidirIt >
BidirIt prev( BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1 );

std::advance

方法与prev和next相似,只是无返回指针

1
2
3
4
5
template<class ForwardIt>
ForwardIt next(ForwardIt it, typename std::iterator_traits<ForwardIt>::difference_type n = 1){
std::advance(it, n);
return it;
}

const_cast

  • 去掉const属性const_cast<int*> (&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。

  • 加上const属性const int* k = const_cast<const int*>(j),一般很少用,因为可以把一个非const变量直接赋给一个const变量,比如:const int* k = j;

1
binary_tree* tmp = const_cast<binary_tree*>(node);

C++11对vector成员函数的扩展

emplace_back

std::vector::cbegin和std::vector::cend

这两个方法是与std::vector::begin和std::vector::end相对应的,从字面就能看出来,多了一个’c’,顾名思义就是const的意思。同理,std::vector::crbegin和std::vector::crend

std::vector::emplace

之前已经对emplace_back进行了讨论,其实还有一个方法叫emplace。
我想说的就是,emplace之于emplace_back就像insert之于push_back。如下使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<code class="hljs cpp">
#include <iostream>
#include <vector>

int main ()
{
std::vector<int> myvector = {10,20,30};

auto it = myvector.emplace ( myvector.begin()+1, 100 );
myvector.emplace ( it, 200 );
myvector.emplace ( myvector.end(), 300 );

std::cout << "myvector contains:";
for (auto& x: myvector)
std::cout << ' ' << x;
std::cout << '\n';

return 0;
}

Output:
myvector contains: 10 200 100 20 30 300</int></vector></iostream></code>

std::vector::data

Returns a direct pointer to the memory array used internally by the vector to store its owned elements.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<code class="hljs cpp">#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] << '\n';
return 0;
}
="" output:="" myvector="" contains:="" 10="" 20="" 0="" 100="" 0</int></vector></iostream></code>

Author: Mrli

Link: https://nymrli.top/2019/11/26/2019-9月7号C-编程笔记/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
app测试
NextPost >
MinMax-极小极大算法——2048
CATALOG
  1. 1. 2019-9月7号C++编程笔记
    1. 1.1. auto
    2. 1.2. std::next
      1. 1.2.1. Parameters:
    3. 1.3. std::prev
    4. 1.4. std::advance
    5. 1.5. const_cast
    6. 1.6. C++11对vector成员函数的扩展
      1. 1.6.1. emplace_back
      2. 1.6.2. std::vector::cbegin和std::vector::cend
      3. 1.6.3. std::vector::emplace
      4. 1.6.4. std::vector::data