2015-01-16 2 views
0

В программе, которую я пишу, у меня есть вектор указателей, чтобы попытаться сохранить использование памяти, и хотя это сделает мою программу более эффективной, я испытываю трудности с передачей вектора указателей в функция direct(). Любая помощь с правильным синтаксисом для передачи этого в функцию с благодарностьюC++: передача вектора указателей в функцию

Отображается текущая ошибка: «ошибка не может преобразовать» std :: vector *>'to' const string '... для аргумента «1» ... линии эта ошибка быть помечена на это линия, в которой Направляйте называются функция

#include <iostream> 
#include <vector> 

using namespace std; 

// a function used to display an array used for testing purposes 
void display_array(const string *arr, size_t size) 
{ 
    int i; 
    for (i = 0; i < size; i++){ 
     cout<<(int(arr[i][0]))-64; 
     cout<<(int(arr[i][1]))-64; 
     cout<<","; 
    } 
} 
// Takes in the connections to the start and the connections to the end and returns the connection if 
//there is a direct connection else returns 0 
string direct(const string *destination, char *start, size_t destination_size) { 
    for (int i = 0; i<destination_size;i++) 
     if ((&destination[i][0] == start) or (&destination[i][1] == start)) 
      return destination[i]; 
} 

int main() 
{ 
    string current; 
    std::vector<string> paths; 
    std::vector<string*> start_connections; 
    std::vector<string*> destination_connections; 
    char start; 
    char destination; 

    cout<<"Input paths in the form 'AB'(0 to exit)\n"; 
    cin>>current; 
    while (current != "0"){ 
     paths.push_back(current); 
     cin>>current; 
    } 

    cout<<"Input starting location\n"; 
    cin>> start; 
    cout<<"Input final destination\n"; 
    cin>>destination; 
    for(int i = 0; i < paths.size(); i++) { 
     if ((paths[i][0] == destination) or (paths[i][1] == destination)) //all connections to the destination 
      destination_connections.push_back(&paths[i]); // paths stored as a pointer to paths array 
     if ((paths[i][0] == start) or (paths [i][1] == start)) //all connections to the start 
      start_connections.push_back(&paths[i]); // paths stored as a pointer to paths array 
    } 
    cout<<direct(&destination_connections,&start,destination_connections.size()); 

    if(!paths.empty()) 
     display_array(&paths[0], paths.size()); 
} 
+2

'direct' берет' string * 'как свой первый аргумент, но вы пытаетесь передать ему' vector * '. Что вы ожидаете от этого? – jwodder

ответ

0

Вы пытаетесь передать vector<string*>* где string* ожидается.

Изменить это:

direct(&destination_connections, &start, destination_connections.size()); 

Для этого:

direct(&destination_connections[0], &start, destination_connections.size()); 

Или это, если вы используете C++ 11:

direct(destination_connections.data(), &start, destination_connections.size()); 

Это, как говорится, не or действительное ключевое слово C++, вам нужно вместо этого использовать ||. И я думаю, что вы неправильно указываете указатели внутри display(). Вам нужно сделать обзор кода того, что вы действительно пытаетесь выполнить.

2

компилятор говорит вам именно то, что случилось. - вектор не является указатель

В идеале вы не должны использовать указатели вообще - объявите свои векторы как

std::vector<std::string> 

и передать ссылку на эту функцию, используя его

... direct(const std::vector<std::string> & dest, ...) 

Вы тогда просто передать вектор, как по значению, но оператор ссылки сообщает компилятор просто передать свой адрес вместо целого объект.

Вы также получаете возможность не передавать свой размер отдельно, так как функция, выполняющая итерацию через него, может получить доступ к этому напрямую (хотя доступ к нему по индексу не является способом OO).

В C++, если вы используете голый указатель, вы, вероятно, делают это неправильно;)

+0

Если я вообще не использую указатель на destination_connections и start_connections, то, разумеется, повторяющиеся данные формируются из того, что уже хранится в векторных дорогах. –

+0

Во-первых, нет причин полагать, что дубликаты создаются, так как большинство std: Строковые реализации используют поведение copy-on-write, которое позволяет им распространять скопированное содержимое. Что еще более важно, вы берете адрес элемента в векторе, который предлагает ** нет ** заверений быть постоянным - то, как вы его используете, вам, вероятно, удастся с ним, но он чрезвычайно хрупкий , и может быть легко сломано. Удалите все указатели, и это будет не только безопаснее, но и намного легче понять. – TedB

Смежные вопросы