数据结构
算法
- future
A future is an object that can retrieve a value from some provider object or function, properly synchronizing this access if in different threads.
future是个可以从供应者对象或函数中检索值得对象,如果在不同线程则可以正确地同步访问。
常和package_task、promise一起使用。
- package_task
A packaged_task wraps a callable element and allows its result to be retrieved asynchronously.
package_task封装一个可调节点,允许他的结果被异步检索。
- promise
A promise is an object that can store a value of type T to be retrieved by a future object (possibly in another thread), offering a synchronization point.
promise是一个对象,存储T类型数据,并通过future对象检索(可能在另一个线程)。提供一个同步点
- std::async()
/*
template<class Fn, class... Args>
future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn, Args&&...args);
参数:
policy:用于指定函数是调用策略
1. std::launch::async 传递的可调用对象异步执行;
2. std::launch::deferred 传递的可调用对象同步执行;
3. std::launch::async | std::launch::deferred 可以异步或是同步,取决于操作系统,我们无法控制;
4. 如果我们不指定策略,则相当于(3)
fn:函数,lambda函数,函数对象等
args:函数fn的调用参数
返回值:
基于fn返回值类型的future对象
*/
///
std::future<bool> fut = std::async (is_prime,313222313);
std::cout << "Checking whether 313222313 is prime.\n";
// ...
bool ret = fut.get(); // waits for is_prime to return
- std::atomic
保护变量时效率更高atomic<long> total = 0;
1. find
find()算法的作用是在指定的一段序列中查找某个数,包含三个参数,前两个参数是表示元素范围的迭代器,第三个参数是要查找的值。
例:fing(vec.begin(), vec.end(), val); //在vec中查找值val,该val可以是数字、字符串。
2. count();
count()算法的作用是查看给定序列中给定值出现的次数,同样包含三个参数,前两个参数是表示元素范围的迭代器,第三个参数是要查找的值。
例:count(vec1.begin(), vec1.end(), 2);//在vec1中查看2出现的次数。
3. accumulate()
accumulate()函数的作用是计算指定范围中各个数相加的和。包含三个参数,前两个参数是求和的序列范围,第三个参数是和的初始值。
例:accumulate(vec1.begin(), vec1.end(), 0);//计算vec1中各个数相加的总和,和的初始值为0;
4.equal();
equal()算法的作用是确定两个序列是否保存相同的值,此算法接受三个迭代器,前两个迭代器表示第一个序列中元素的范围,第三个迭代器表示第二个序列的手元素。如果相等,则返回true, 否则返回false;
equal(vec.begin(), vec.end(), vec2.begin());//比较vec和vec2中的元素是否相同。
5.fill();
fill()算法的作用是对一个范围内的所有元素赋值,包含三个参数,前两个参数接受一对迭代器表示一个范围,第三个迭代器接受一个值。
例:fill(vec.begin(), vec.end(), "");//将vec中的所有元素都置为空。
6.copy();
copy()算法将输入范围中的元素拷贝到目的序列中。包括三个参数,前两个表示一个输入范围,第三个表示序列的起始位置。
例:int a1[] = {0,1,2,3,4,5,6,7,8,9};
int a2[sizeof(a1)/sizeof(*a1)];
//ret指向拷贝到a2的为元素之后的位置
auto ret = copy(begin(a1), end(a1), a2);//把a1的内容拷贝到a2.
std::copy_if
:复制满足指定条件的元素到另一个容器。std::move
:将元素从一个容器移动到另一个容器(move),而非拷贝(copy)。std::move_backward
:类似std::move
,但是从范围的末尾开始操作,适合某些特定的容器操作。
7.replace();
replace()算法的作用是将给定序列中所有等会给定值的元素都改为另一个值,此算法接收四个参数,前两个是迭代器,表示输入序列范围,第三个是表示要搜索的 值,第四个是要换的新值。
例:replace(vec.begin(), vec.end(), "", "test");//将vec中的空字符串改为test。
如果我们需要保证原序列的值不变,则可以使用replace_copy()算法,使原序列不变,将改变后的序列值拷贝给新容器。
例:replace_copy(vec.begin(), vec.end(),back_inserter(vec2), "", "test");//将修改后的新序列保存到vec2中,原序列值不变。
8.sort();
sort()算法的作用是重新排列输入的序列中的元素,它是按照字典序列来重新排布序列。
例:vector<string> vec = {"the", "quick", "red", "for", "jump","over", "the", "slow", "red", "turtle"};
sort(vec.begin(), vec.end());
执行完后的结果:for jump over quick red slow the the turtle
9.for_each();
for_each()算法的主要作用是打印输出序列。接收三个参数,前两个为打印元素的范围,后一个为一个可调用对象。
例:for_each(wc, vec.end(), [](const string &s){cout << s << " ";});