我收到了编译错误。我正在尝试向矢量添加字符串并将其保持为“排序顺序”。
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 :(得分:7)
insert
提供一个插入某个位置的迭代器。您需要改为使用push_back
(与insert
相同,end()
作为参数。)
修改强>
你在评论中提到:
我不想使用push_back,因为我希望对字符串进行排序。 这是我使用矢量
的原因之一
我想念那句话中的逻辑。如果您想要一个已排序的容器,则应使用std::set
或std::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 );
}
}
}
然而,有两个快速评论:
您应该通过const引用传递std::string
,
而不是价值。无论出于何种原因,这几乎都是
普遍的惯例,如果你不遵循它,人们会怀疑
这是为什么。
任何时候您都关注标准中的订单,您需要
定义排序关系。默认值为std::less<>
,即。{
默认为<
。但是可以传递std::lower_bound
之类的函数
一个额外的参数,以任何你想要的方式定义顺序
(受限于它是“严格的弱排序”)。一世
提到这一点是因为在<
上定义std::string
的方式毫无用处
在大多数情况下,您处理实际文本,所以您可能想要
考虑定义自己的订购关系。