2012-03-30 137 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定義的方式<是無用的 在你處理實際文本的大多數情況下,所以你可能想要 考慮定義你自己的訂購關係。