2016-01-23 6 views
1

Это сокращенная версия моего действительного кода. Это тоже не работает. ЛинияУ меня есть проблема с назначением вектора другому вектору. Программа вылетает

tempPurchaseAndID[0] = tempPurchase; 

вызывает сбой.

#include<vector> 
#include<iostream> 
using namespace std; 
int main() 
{ 

    string* strTempPurchase = new string("", ""); 
    string* tempOneID = new string("", ""); 
    vector<string> temp;//if category name exists in his purchase 
    vector<string*/*size of two*/> tempPurchase; 
    vector<string*/*size of two*/> oneID;// vector for one id 

    vector<string*>* tempPurchaseAndID{}; 
    tempOneID[0] = "2222"; 

    oneID.push_back(tempOneID); 
    strTempPurchase[0] ="milk"; 
    strTempPurchase[1] = "3"; 
    tempPurchase.push_back(strTempPurchase); 
    tempPurchaseAndID[0] = tempPurchase; 
    tempPurchaseAndID[1] = oneID; 
    std::cin.get(); 
    return 0; 
} 

Может кто-нибудь увидеть проблему и предложить решение? Спасибо заранее.

P.S. Мне нужны указатели на другие вещи, поэтому я не могу удалить указатели.

+4

Не используйте эти указатели на всем протяжении! Вероятно, это поможет решить вашу проблему. –

+0

Но мне это нужно для других вещей в моем проекте. – alonpeer12345

+2

Звучит странно, что они вам понадобятся, обычно это не так. Вероятно, у вас есть серьезный недостаток дизайна в вашем _real проекте. –

ответ

1

std::vector поддерживает assignment operator уже, то же самое для std::string.

Я не вижу причин, по которым вы возитесь с указателями здесь. Копирование указателей не даст вам то, что вы, вероятно, хотите достичь.

+0

Хорошо, но знаете ли вы, в чем проблема? – alonpeer12345

+0

@ user4384866 Конечно, проблема в том, что вы используете указатели, как уже упоминалось. –

2

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

Во-первых, vector<string*>* tempPurchaseAndID{}; не является вектором, но нулевым указателем. Отключение нулевого указателя с tempPurchaseAndID[0] приводит к segfault.

Было бы лучше использовать только вектор, а не указатель на вектор:

vector<vector<string*> > tempPurchaseAndID; 

Но даже сейчас, ваша программа будет по-прежнему врезаться в одной и той же линии, но на этот раз из-за другой причине: tempPurchaseAndID будет иметь длину 0 и нет элемента с индексом 0 в нем! Так что лучше использовать push_back, добавление элементов к вектору в конце:

tempPurchaseAndID.push_back(tempPurchase); 
tempPurchaseAndID.push_back(oneID); 

Попробуйте уменьшить использование указателей - они являются источником многих ошибок и ошибок.

+0

Я сделал vector * tempPurchaseAndID {}; потому что мне нужен массив векторов массивов строк. Да, это сложно, но это то, что мне нужно. Вот почему я не могу отодвинуть, потому что tempPurchaseAndID массив не вектор – alonpeer12345

+0

@ user4384866 то вам нужно вектор <вектор > и по-прежнему можно использовать push_back(). Однако вектор вектора указателей на строку является довольно сложной конструкцией и нелегко работать с ... – ead

+0

, так что вы думаете, что вектор будет лучше здесь вместо массива? – alonpeer12345

0

Вы переезжаете прошли первую строку и пытается записать в строку, которая просто не существует здесь:

strTempPurchase[0] ="milk"; 
strTempPurchase[1] = "3"; 

Тогда вы делаете что-то подобное здесь, с добавленной проблемой, что вы никогда не создать экземпляр strTempПокупка:

tempPurchaseAndID[0] = tempPurchase; 
tempPurchaseAndID[1] = oneID; 

Также обратите внимание, что обработка векторов через указатели не идеальна. Если вы измените размер вектора (например, с помощью push_back), вектор может переместить свои данные в другое место, что приведет к недействительности ваших указателей.

+0

О, я думаю, я понимаю. Вы знаете, как его решить? – alonpeer12345

+0

Есть куча вещей, которые вы могли бы сделать. Скорее всего, вам не нужны эти указатели, так как ваши строки и векторы в основном. Значит, они будут существовать до выхода программы. Если вам действительно нужно направить указатели на них, вы можете просто использовать адрес оператора. Для строк, если вам нужна пара строк, я бы предложил использовать контейнер, возможно, std :: pair (или указатели). – Andrej