将字符串插入向量

时间:2012-03-30 01:02:16

标签: c++ string vector insert

我收到了编译错误。我正在尝试向矢量添加字符串并将其保持为“排序顺序”。

XYZ是我的班级。 addPortEntry

class XYZ
{
    public:
        portListFile(string sTmp);
        void addPortEntry(string sPortName, string sDirection);
    private:
        string sPortListFileName;
        vector <string> v_input_ports;
    ...
};

void XYZ::addP(string sP, string sDir)
{
    if(sDir == "in")
    {
        v_input_ports.insert(sP);   // Line 42
    }
    ...
}

错误:

XYZ.cpp: In member function ‘void XYZ::addP(std::string, std::string)’:
XYZ.cpp:42: error: no matching function for call to ‘std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >::insert(const char [10])’
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/vector.tcc:93: note: candidates are: typename std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:657: note:                 void std::vector<_Tp, _Alloc>::insert(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, size_t, const _Tp&) [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]

3 个答案:

答案 0 :(得分:7)

应该为

insert提供一个插入某个位置的迭代器。您需要改为使用push_back(与insert相同,end()作为参数。)

修改

你在评论中提到:

  

我不想使用push_back,因为我希望对字符串进行排序。   这是我使用矢量

的原因之一

我想念那句话中的逻辑。如果您想要一个已排序的容器,则应使用std::setstd::map。如果要重复值,请使用“多个”版本。

答案 1 :(得分:2)

也许你的意思是push_back而不是insert

答案 2 :(得分:1)

一般来说,您可以将元素附加到矢量 (push_back),或者您可以将其插入指定位置(insert)。至 在指定的地方插入一个对象,你必须指定这个地方; std::vector<>::insert有两个参数,第一个是迭代器 指定要插入的位置和第二个值。

您说您希望按排序顺序维护内容。通常 习惯用法是使用std::lower_bound找到位置,例如:

void
XYZ::addP( std::string const& sP, std::string const& sDir )
{
    if ( sDir == "in" ) {
        std::vector<std::string>::iterator pos
            = std::lower_bound( v_input_ports.begin(),
                                v_input_ports.end(),
                                sP );
        if ( pos != v_input_ports.end() && *pos == sDir ) {
            //  Object already present...
            *pos = sP;  //  But maybe an error is more appropriate
        } else {
            v_input_ports.insert( pos, sP );
        }
    }
}

然而,有两个快速评论:

  1. 您应该通过const引用传递std::string, 而不是价值。无论出于何种原因,这几乎都是 普遍的惯例,如果你不遵循它,人们会怀疑 这是为什么。

  2. 任何时候您都关注标准中的订单,您需要 定义排序关系。默认值为std::less<>,即。{ 默认为<。但是可以传递std::lower_bound之类的函数 一个额外的参数,以任何你想要的方式定义顺序 (受限于它是“严格的弱排序”)。一世 提到这一点是因为在<上定义std::string的方式毫无用处 在大多数情况下,您处理实际文本,所以您可能想要 考虑定义自己的订购关系。