2012-03-30 163 views
2

我收到编译错误。我正在尝试向一个向量添加字符串,并将它们保存为“排序顺序”。将字符串插入到矢量

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

当您(可能)没有使用过的函数出现编译错误时,请查看这些函数的文档。你将学会如何使用它们,并且可能会在同一个地方找到更好的东西。在这种情况下,'push_back'会列在侧面,因为它也是'vector'的一部分,如果碰巧看到了名称,它会引起您的注意。 – chris 2012-03-30 01:27:56

+0

我不想使用push_back,因为我想要对字符串进行排序。这是我使用矢量的原因之一。 – 2012-03-30 03:20:06

+0

@KingkongJnr一个人与另一个人有什么关系?那么为什么不使用map然后> – littleadv 2012-03-30 04:21:37

回答

7

insert应该给一个迭代器插入到某个位置。您需要使用push_back(与insertend()作为参数相同)。

编辑

您在评论中提到:

I do not want to use push_back since I want the strings to be sorted. That is one of the reasons I'm using the vector

我错过了逻辑的发言。如果你想要一个分类容器,你应该使用std::setstd::map。如果要重复值,请使用“多个”版本。

+0

对不起。我应该明确提到这两种说法的区别。我不想使用push_back,因为我想要对字符串进行排序。此外,这是我使用矢量的原因之一(暗示我向开放的向量无法做到这一点的向导)。我将探索使用std :: set。 我不想使用地图,因为它不是一对数据,只有一对。例如 例如。个别元素都是像“丰田”,“本田”等刺。如果是像“丰田,100”,“本田,300”的东西,那么地图会更有意义(我猜)。 真的很感谢您的及时回复littleadv。 – 2012-03-30 05:08:52

2

也许你的意思是push_back而非insert

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定义的方式<是无用的 在你处理实际文本的大多数情况下,所以你可能想要 考虑定义你自己的订购关系。