C++ 插入到通用容器中';行不通

C++ 插入到通用容器中';行不通,c++,templates,stl,c++11,C++,Templates,Stl,C++11,我试图生成int或double类型的随机数,然后将它们插入一种容器向量,按排序顺序列出 但问题是insert不起作用,我不知道为什么,你能帮我吗 #include <iostream> #include <iterator> #include <random> #include <vector> #include<list> #include<deque> #include <algorithm> #includ

我试图生成int或double类型的随机数,然后将它们插入一种容器向量,按排序顺序列出 但问题是insert不起作用,我不知道为什么,你能帮我吗

#include <iostream>
#include <iterator>
#include <random>
#include <vector>
#include<list>
#include<deque>
#include <algorithm>
#include <chrono>

using namespace std;

int random_gen(){
    default_random_engine re { std::random_device()() };
    uniform_int_distribution<int> dist;
    auto r= bind(dist,re);
    int x =r();
    return x;
}



template<typename SequenceContainer>
void build_cont(const SequenceContainer& seq, int n)
{
    for(int i=0; i!=n; ++i) {
        int gen = random_gen();
        //std::iterator<T> it=lower_bound(begin(seq), end(seq), gen);
        typename SequenceContainer::iterator it;
        it=find_if(seq.begin(), seq.end(), [it](){ return *it<gen;});
        seq.insert(it, gen);
    }
    for(auto i:seq)
        cout<<i<<endl;
}
int main() {
    int n=10;
    vector<int> v;
    list<int>ls;
    deque<int> deq;
    build_cont(v, n);
    build_cont(ls, n);
    build_cont(deq, n);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int random_gen(){
默认的随机引擎{std::random_device()()};
均匀分布区;
自动r=绑定(距离、重新);
int x=r();
返回x;
}
模板
void build_cont(const SequenceContainer&seq,int n)
{
对于(int i=0;i!=n;++i){
int gen=随机_gen();
//std::迭代器it=下限(开始(seq)、结束(seq)、生成);
typename SequenceContainer::迭代器;
it=find_if(seq.begin()、seq.end()、[it](){return*it有两个问题:

  • 您不能获取SequenceContainer的常量引用,然后尝试获取非常量迭代器或将项插入该常量引用。请删除常量

  • 您需要在lambda capture子句中包含“gen”,并且它必须将该值作为参数:

    typename SequenceContainer::iterator it = find_if(
        seq.begin(),
        seq.end(),
        [gen](const int& val) { return gen < val; }
    );
    
    typename SequenceContainer::iterator it=find\u if(
    seq.begin(),
    seq.end(),
    [gen](const int&val){return gen
  • 有两个问题:

  • 您不能获取SequenceContainer的常量引用,然后尝试获取非常量迭代器或将项插入该常量引用。请删除常量

  • 您需要在lambda capture子句中包含“gen”,并且它必须将该值作为参数:

    typename SequenceContainer::iterator it = find_if(
        seq.begin(),
        seq.end(),
        [gen](const int& val) { return gen < val; }
    );
    
    typename SequenceContainer::iterator it=find\u if(
    seq.begin(),
    seq.end(),
    [gen](const int&val){return gen

  • 如果您希望按顺序插入(即,在插入时保持顺序)为什么不使用
    std::set
    std::multiset
    ?我需要代码来处理vector、list和dequet。我的问题是find_if和insert什么编译器会把这一点带到链接器错误的程度?
    gen
    没有被捕获,非常量迭代器无法从find_分配它如果在常量容器上,etcMreover,您可以拥有一个常量容器
    const SequenceContainer&seq
    ,您将无法在那里添加任何内容。如果您希望按顺序插入它们(即,在插入时保持顺序)为什么不使用
    std::set
    std::multiset
    ?我需要代码来处理vector、list和dequet。我的问题是find_if和insert什么编译器会把这一点带到链接器错误的程度?
    gen
    没有被捕获,非常量迭代器无法从find_分配它如果在常量容器上,etcMreover,您可以如果有一个const container
    const SequenceContainer&seq
    ,您将无法在那里添加任何内容。谢谢,这似乎可行,但请回答一些其他问题,如果我想插入字符串而不是int,但使用相同的函数,如何检索类型?您可以使用“typename SequenceContainer::reference”要检索类型:
    typename SequenceContainer::iterator it=find_如果(seq.begin(),seq.end(),[gen](const-typename SequenceContainer::reference&val){return gen
    @LeftoverPi:
    SequenceContainer::reference
    已经是一个引用,那么
    &
    就是噪声(我假设您真的想要
    SequenceContainer::const_reference
    )–您评论中的内容对于
    SequenceContainer::value\u type
    是正确的。谢谢,这似乎可行,但请回答一些其他问题,如果我想插入字符串而不是int,但使用相同的函数,如何检索类型?您可以使用“typename SequenceContainer::reference”要检索类型:
    typename SequenceContainer::iterator it=find_如果(seq.begin(),seq.end(),[gen](const-typename SequenceContainer::reference&val){return gen
    @LeftoverPi:
    SequenceContainer::reference
    已经是一个引用,那么
    &
    就是噪声(我假设您确实想要
    SequenceContainer::const\u reference
    )-您的评论中的内容对于
    SequenceContainer::value\u type
    是正确的。