C ++ копирует строковый массив [] в вектор <string> - PullRequest
4 голосов
/ 30 апреля 2011

Итак, я делаю этот класс с функцией-членом «insert» для копирования из строкового массива в содержимое классов, которое является векторным массивом.

Эта ошибка прерывания продолжает появляться, говоря, что я собираюсьза концом вектора, но я не понимаю почему ....

Вот код:

/////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////      Map class   /////////////////////
class Map
{
private:
///////////////////////////////////////////     Map Variables ///////////////
    string _name;
    vector <string> _contents;

public:
    Map(string name){_name = name;
                     _contents.reserve(56);};
    ~Map(){};
    string getName()
    {
    return _name;
    };

    vector <string> getContents()
    {
        return _contents;
    };

///////////////////////////////////////////     Insert  ////////////////////////
            //  string* to an array of 56 strings;
    bool Insert(string* _lines_)
    {

    for (int I = 0; I < 3; I++)
    {
        _contents[I] = _lines_[I];
    }
        return true;
    };


};

Если вам нужна дополнительная информация, просто спросите! Спасибо!

Ответы [ 5 ]

8 голосов
/ 30 апреля 2011

На самом деле, вам не нужно копировать их самостоятельно. Вы можете использовать std::vector::assign для преобразования c-style array в std::vector.

вектор :: назначить

Назначает новое содержимое векторному объекту, удаляя все элементы, содержащиеся в векторе, перед вызовом и заменяя их элементами, указанными в параметрах.

Пример

string sArray[3] = {"aaa", "bbb", "ccc"};
vector<string> sVector;
sVector.assign(sArray, sArray+3);
        ^ ok, now sVector contains three elements, "aaa", "bbb", "ccc"

Подробнее

http://www.cplusplus.com/reference/stl/vector/assign/

2 голосов
/ 30 апреля 2011

Используйте std::copy как:

#include <algorithm> //for std::copy
#include <iterator>  //for std::back_inserter

std::copy(_lines_, _lines_ + count, std::back_inserter(_contents));

где count - общее количество строк в массиве. Если общее число строк 56, count должно быть 56, а не 55 (если вы хотите, чтобы все строки были скопированы в _contents).

1 голос
/ 30 апреля 2011

Вы должны изменить размер vector <string> _contents, прежде чем сможете добавлять какие-либо элементы с помощью оператора subscript [].

Также: укажите конструктор по умолчанию для вашего класса Map.

1 голос
/ 30 апреля 2011
  1. Вы не должны использовать префиксные идентификаторы подчеркивания
  2. Назначить _name в списке инициализатора: Map(string name) : _name(name) {
  3. _contents имеет достаточную емкость для 56 элементов, но не имеет реальных элементов. Вы должны либо изменить его размер (_contents.resize(56);), либо добавить к нему элементы в методе Insert (_contents.push_back(_lines_[I]);), либо создать его с достаточной емкостью (добавьте , _contents(56) в список инициализаторов).
1 голос
/ 30 апреля 2011

Вектор не имеет размера (просто пробел reserve ed).

Вы должны либо resize() вектор, либо использовать push_back() для добавления новых элементов.

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