Вставка строк в вектор - PullRequest
2 голосов
/ 30 марта 2012

Я получаю ошибку компиляции. Я пытаюсь добавить строки в вектор и сохранить их в «отсортированном порядке».

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 ]

7 голосов
/ 30 марта 2012

insert должен быть предоставлен итератор для вставки в определенном месте. Вместо этого вам нужно использовать push_back (что аналогично insert с end() в качестве параметра).

1012 * редактировать *

Вы упомянули в комментариях:

Я не хочу использовать push_back, поскольку хочу, чтобы строки были отсортированы. Это одна из причин, по которой я использую вектор

Мне не хватает логики в этом утверждении. Если вы хотите отсортированный контейнер, вы должны использовать std::set или std::map. Используйте «multi-» версии, если вы хотите повторять значения.

2 голосов
/ 30 марта 2012

Возможно, вы имели в виду push_back, а не insert?

1 голос
/ 30 марта 2012

Вообще говоря, вы можете добавить элемент к вектору (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. Вы, вероятно, должны проходить std::string по константной ссылке, а не по значению.По каким-то причинам это почти универсальное соглашение, и если вы не будете его соблюдать, люди будут удивляться, почему.

  2. Каждый раз, когда вас интересует порядок в стандарте, вынеобходимо определить порядок заказа.По умолчанию std::less<>, что по умолчанию <.Но функциям, подобным std::lower_bound, может быть передан дополнительный аргумент, который определяет порядок любым способом, который вам нужен (с учетом ограничения, что это «строгий слабый порядок»).Я упоминаю об этом, потому что способ определения < в std::string бесполезен в большинстве случаев, когда вы имеете дело с реальным текстом, поэтому вы можете подумать об определении ваших собственных отношений заказа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...