[2018年4月29号]C++ primer 课后练习 第十章 泛型算法

10.1


10.2


10.3


10.4

第三个参数的类型决定了使用那种类型的运算符,当前例子中,容器元素类型为double,而第三参数类型为int,运算accumulate时候虽然编译器不会报错,但是会导致小数部分丢失

10.5

结果不会受到影响,容器类型只要能用==来比较即可

10.6


10.7

a.使用copy时,拷贝容器大小必须要大于等于被拷贝容器

int main(){
    vector<int > vec_0 ; list<int > list_0;
    for(int i = 0 ; i != 10; i++){
        vec_0.push_back(i);
    }
    list_0.resize(vec_0.size());
    copy(vec_0.cbegin(), vec_0.cend(), list_0.begin());
    for(auto tmpInt : list_0){
        cout << tmpInt<<endl;
    }
    for (;;);
    return 0;
} 

b.fill_n某个容器时,容器的大小必须大于等于fill_n,否则会造成越界操作,而reserve只是分配了容器的可分配大小,并没有实质改变容器的具体大小所以会报错,修改如下

int main(){
    vector<int > vec_0 ; 
    vec_0.resize(10);
    fill_n(vec_0.begin(),10,1);
    for(auto tmpInt : vec_0){
        cout << tmpInt << endl;
    }
    for (;;);
    return 0;
}

10.8

back_inserter返回的是插入迭代器,对迭代器进行赋值后实际的操作是push_back,所以不会发生断言失效

10.9

void elimDups(vector<int >& vecInt){
    sort(vecInt.begin(), vecInt.end());
    vector<int >::iterator tmpIt = unique(vecInt.begin(), vecInt.end());
    vecInt.erase(tmpIt, vecInt.end());
}

int main(){
    vector<int > vec = {0,1,5,1,2,6,5,1,2,3,5,6,1} ; 
    elimDups(vec);
    for(auto tmpInt : vec){
        cout << tmpInt << endl;
    }
    for (;;);
    return 0;
}

10.10

因为算法使用的是迭代器操作,但是迭代器插入或删除既改变容器大小后会导致迭代器失效,所以算法不能改变容器大小

10.11


10.12

10.13

int isCondition(const string& s1) {
    return s1.size() >= 5;
}
void checkStringSize(vector<string >& vecStr){
    vector<string >::iterator it = partition(vecStr.begin(), vecStr.end(), isCondition);
    for(auto vecIt = vecStr.begin(); vecIt!=it; vecIt++){
        cout << *vecIt<< endl;
    }
}
int main(){
    vector<string > vec = {"123","12345","12","123456","123456789"} ;
    checkStringSize(vec);
    for (;;);
    return 0;
}

10.14:

    [](const int & i1,  const int & i2){
        return i1+ i2;
    };

10.15

    int size = 0;
    [size](const int & i1) {
        return i1 + size;
    };

10.16

void biggies(vector<string >& vecStr, const vector<string>::size_type& sz){
    stable_sort(vecStr.begin(), vecStr.end(), [](const string& s1, const string& s2) {return s1.size() < s2.size(); });
    elimDups(vecStr);
    vector<string>::iterator it = find_if(vecStr.begin(), vecStr.end(), [sz](const string& s1){return s1.size() >= sz;});
    for_each(it, vecStr.end(), [](const string& s1) { cout << s1 << endl; });
}

int main(){
    vector<string > vecStr = {"12","123","12345", "12345689","123","12"};
    biggies(vecStr,3);
    for (;;);
    return 0;
}

10.17

10.18

void biggies(vector<string >& vecStr, const vector<string>::size_type& sz){
    elimDups(vecStr);
    vector<string>::iterator it = partition(vecStr.begin(), vecStr.end(), [sz](const string& s1){return s1.size() >= sz;});
    for_each(vecStr.begin(), it, [](const string& s1) { cout << s1 << endl; });
}

int main(){
    vector<string > vecStr = {"12","123","12345", "12345689","123","12"};
    biggies(vecStr,3);
    for (;;);
    return 0;
}

10.19

void biggies(vector<string >& vecStr, const vector<string>::size_type& sz){
    elimDups(vecStr);
    vector<string>::iterator it = stable_partition(vecStr.begin(), vecStr.end(), [sz](const string& s1){return s1.size() >= sz;});
    for_each(vecStr.begin(), it, [](const string& s1) { cout << s1 << endl; });
}

int main(){
    vector<string > vecStr = {"12","123","12345", "12345689","123","12"};
    biggies(vecStr,3);
    for (;;);
    return 0;
}

10.20

int main(){
    vector<string >vec  = {"123","1234","123","123456","123456789","123456798"};
    cout << count_if(vec.begin(),vec.end(),[](const string& s1){return s1.size() > 6;})<<endl;
    for (;;);
    return 0;
}


10.21

int main(){
    int theCountDown = 10;
    auto theCheckFunc = [&theCountDown]()->bool {
        if (theCountDown) {
            return true;
        }
        else {
            return false;
        }};
    while (theCheckFunc())
    {
        --theCountDown;
    }
    cout << theCountDown << endl;
    for (;;);
    return 0;
}

10.22

bool isCondition(const string& s1) {
    return s1.size() <= 5;
}

int main(){
    vector<string >vec = { "123","1234","123","123456","123456789","123456798" };
    elimDups(vec);
    vector<string>::iterator it = partition(vec.begin(), vec.end(), isCondition);
    for_each(vec.begin(), it, [](const string& s1){cout <<s1<<endl; });
    for (;;);
    return 0;
}

10.23

根据占位符数量及列表数量来确定bind的参数数量

10.24

bool check_size(const int& val, const string& s1){
    return val >= s1.size();
}

int main(){

    vector<int > vecInt = {1,2,3,4,5,6,7,8,9};
    string theStr = "1234";
    auto bindFunc = bind(check_size, _1, theStr);
    cout << *find_if(vecInt.begin(), vecInt.end(), bindFunc) << endl;

    for (;;);
    return 0;
}

10.25

bool check_size(const string& s1, const int& val) {
    return s1.size() >= val;
}
void biggiesWithBind(vector<string >& vecStr, const vector<string>::size_type& sz) {
    elimDups(vecStr);
    auto bindFunc = bind(check_size, _1, sz);
    vector<string>::iterator it = partition(vecStr.begin(), vecStr.end(), bindFunc);
    for_each(vecStr.begin(), it, [](const string& s1) { cout << s1 << endl; });
}
int main(){
    vector<string >vec = { "123","1234","123","123456","123456789","123456798" };

    biggiesWithBind(vec, 5);
    for (;;);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_22478401/article/details/80141191
今日推荐