【问题标题】:Inserting strings to vector将字符串插入向量
【发布时间】:2012-03-30 01:02:16
【问题描述】:

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

XYZ 是我的班级。添加端口条目

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> > >]

【问题讨论】:

  • 当您(可能)没有使用过的函数出现编译错误时,请查看函数的文档。您将确切地学习如何使用它们,并且可能会在同一个地方找到更好的东西。在这种情况下,push_back 会列在旁边,因为它也是 vector 的一部分,如果您碰巧看到了这个名字,它会因此而引起您的注意。
  • 我不想使用 push_back 因为我想要对字符串进行排序。这就是我使用矢量的原因之一。
  • @KingkongJnr 两者之间的关系如何?那么为什么不使用地图>

标签: c++ string vector insert


【解决方案1】:

insert 应该被赋予一个迭代器以插入到某个位置。您需要改用push_back(与insert 相同,以end() 作为参数)。

编辑

您在 cmets 中提到:

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

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

【讨论】:

  • 对不起。我应该清楚地提到这两种说法之间的区别。我不想使用 push_back 因为我想要对字符串进行排序。此外,这也是我使用向量的原因之一(暗示我愿意接受建议,以防向量可以做到这一点)。我将探索使用 std::set。我不想使用地图,因为它不是一对数据,只是一个。例如。各个元素都是诸如“丰田”“本田”之类的刺痛。如果是“丰田,100”,“本田,300”之类的东西,那么地图会更有意义(我猜)。非常感谢您的及时回复 littleadv。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    一般来说,您可以将元素附加到向量 (push_back),也可以插入到指定位置(insert)。到 在指定位置插入对象,您必须指定位置; std::vector&lt;&gt;::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 );
            }
        }
    }
    

    然而,两个快速的 cmets:

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

    2. 当您关心标准中的顺序时,您需要 定义排序关系。默认为std::less&lt;&gt;,由 默认是&lt;。但是像std::lower_bound 这样的函数可以通过 一个附加参数,它以您想要的任何方式定义顺序 (受限于它是“严格的弱排序”)。一世 提到这一点是因为在std::string 上定义&lt; 的方式是无用的 在大多数情况下,您正在处理实际文本,因此您可能想要 考虑定义自己的排序关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      相关资源
      最近更新 更多