2013-08-18 2 views
1

У меня возникли проблемы с моим методом. Я хочу, чтобы он принимал массив строк в качестве первого аргумента вместо векторной строки. Однако, когда я пытаюсь использовать Array строк и сделать один в основной функции, я получаю всевозможные ошибки. Я не знаю, должен ли я указывать указатель на массив строк для моего аргумента или просто строку. Любая помощь?vector vs. array в C++

#include <cstdio> 
#include <cstring> 
#include <cmath> 
#include <algorithm> 
#include <vector> 
#include <map> 
#include <set> 
#include <string> 
#include <sstream> 
#include<iostream> 
using namespace std; 
class UserName 
{ 
    public: 
    string newMember(string* exist, string newname) { 
    bool found = false; 
    bool match = false; 
    stringstream ss; 
    string result; 
    string othername; 
    for(int i = 0; i < exist.size(); i++){ 
     if(exist[i] == newname){ 
      found = true; 
     break; 
     } 
    } 
    if(found){ 
     for(int x = 1; ; x++){ 
      match = false; 
     ss.str(""); 
     ss << newname << x; 
     for(int i = 0; i < exist.size();i++){ 
      //cout << ss.str() << endl; 
      othername = ss.str(); 
      if(exist[i] == othername){ 
       match = true; 
      break; 
      } 
     } 
     if(!match){ 
      result = ss.str(); 
      break; 
     } 
     } 
     return result; 
    } 
    else return newname; 
    } 
}; 
int main(){ 
    UserName u; 
    string Database [4]; 
    Database[0] == "Justin"; 
    Database[1] == "Justin1"; 
    Database[2] == "Justin2"; 
    Database[3] == "Justin3"; 
    cout << u.newMember(Database, "Justin") << endl; 
    return 0; 
} 
+0

Сообщения об ошибках - ваш друг. – keyser

+0

Я отредактировал op до нужного кода. Я отправил неправильную версию – user2510809

ответ

4

Используйте как следующее:

std::string Database[] ={ "Justin", "Justin1", "Justin2","Justin3" };

newmember в

string newMember(std::string exist[], std::size_t n, string newname)

заменить exist.size() с n

В main:

cout << u.newMember(Database, 4,"Justin") << endl;

Также согласно вашему отредактирован поста

Оператор = не то же самое, как оператор ==, первый является оператором присваивания (присваивает значение в его справа на переменную слева), а другая == - оператор равенства

Таким образом, вам необходимо использовать как:

Database[0] = "Justin"; 
Database[1] = "Justin1"; 
Database[2] = "Justin2"; 
Database[3] = "Justin3"; 
6

Массивы в C++, к сожалению, являются особым случаем и во многом не ведут себя как правильные значения. Несколько примеров:

void foo(int c[10]); // looks like we're taking an array by value. 
// Wrong, the parameter type is 'adjusted' to be int* 

int bar[3] = {1,2}; 
foo(bar); // compile error due to wrong types (int[3] vs. int[10])? 
// No, compiles fine but you'll probably get undefined behavior at runtime 

// if you want type checking, you can pass arrays by reference (or just use std::array): 
void foo2(int (&c)[10]); // paramater type isn't 'adjusted' 
foo2(bar); // compiler error, cannot convert int[3] to int (&)[10] 

int baz()[10]; // returning an array by value? 
// No, return types are prohibited from being an array. 

int g[2] = {1,2}; 
int h[2] = g; // initializing the array? No, initializing an array requires {} syntax 
h = g; // copying an array? No, assigning to arrays is prohibited 

(из here)

Если вы хотите массив, который ведет себя как правильное использование значения std::array.

#include <array> 
#include <string> 

void foo(std::array<std::string, 10> arr) { /* ... */ } 

int main() { 
    std::array<std::string, 10> arr = {"Justin", "Justin1", "Justin2", "Justin3"}; 
    foo(arr); 
}