2011-01-19 2 views
0

В C++, используя векторный заголовок, как мне найти количество элементов?C++ Vector Elements Count

#include <iostream> 
#include <cmath> 
#include <fstream> 
#include <cstdlib> 
#include <vector> 
using namespace std; 
int primer(int max); 
int main() 
{ 
    system("pause"); 
    return 0; 
    primer(1000); 
} 

int primer(int max){ 
    vector<int> a; 
    a[1]=2; 
    for (int i=2;i<=max;i++){ 
    bool prime=true; 
    for (int ii=1;ii<=#a;ii++) { 
    if i/a[ii]==math.floor(i/a[ii]) { 
    prime=false; 
    } 
    } 
    if prime==true { 
    a[#a+1]=i; 
    } 
    } 
    for (i=1;i<=#a;i++) { 
    cout << a[i]); 
    } 
} 
} 

Первоначально я написал код для Lua, и это моя попытка перевести его на C++. Я был бы признателен за специфику, например, за конкретную замену плохой линии. Я попытался заменить #a на a.size, но это не сработало.

После доработки:

#include <iostream> 
#include <cmath> 
#include <fstream> 
#include <cstdlib> 
#include <vector> 
using namespace std; 
int primer(int max); 
int main() 
{ 
    primer(5); 
    system("pause"); 
    return 0; 
} 

int primer(int max){ 
    vector<int> a; 
    a[1]=2; 
    for (int i=2;i<=max;i++){ 
    bool prime=true; 
    for (int ii=0;ii<a.size();ii++) { 
    if (i/a[ii]==floor(i/a[ii])) { 
    prime=false; 
    } 
    } 
    if (prime==true) { 
    a.push_back(i); 
    } 
    } 
    for (int iii=0;iii<=a.size();iii++) { 
    cout << a[iii] << endl; 
    } 
} 

Он падает без запуска. По какой причине это?

+1

У вас тоже будут проблемы с диапазоном. Чтобы использовать вектор правильно, вам придется либо указать его размер, либо использовать 'push_back'. –

+2

@TimeCoder: Не обижайтесь, но попытка научиться программировать на C++ (редактировать), публикуя на SO, будет расточаю как ваше время, так и наше. –

+0

То же, что и для 99% аналогичного вопроса http://stackoverflow.com/questions/4741436/boundless-arrays, который вы только что разместили сами. –

ответ

4

Чтобы ответить на ваш непосредственный вопрос:

a.size(); // use size as a function 

Но есть несколько других вещей неправильно с вашим кодом:

vector<int> a; 
a[1]=2; 

Обычно вам необходимо установить размер a заранее, так как C++ должен выделить пространства для него. Вы можете использовать push_back(), хотя это будет поэтапно добавлять пространство по мере необходимости.

Кроме того, C++ массивы начинают отсчет с 0:

for (int ii=1;ii<=#a;ii++) { 

Это должно быть

ii = 0 

А так как массивы начинаются с 0, они заканчиваются в size() - 1, а не size().

+0

Dang, 6 секунд. +1. –

+2

Вы заметили ошибку «один за другим» и не исправили переполнение, вызванное этим :( –

+0

@Ben Ah! Теперь я добавлю ... – chrisaycock

5

a.size().

Я бы рекомендовал использовать какой-либо справочный материал, например. http://cplusplus.com/reference/stl/vector/.

+0

Oh! .size(), а не свойство. Это имеет смысл. Спасибо :) – TimeCoder

+1

'a.size()' не является последним полезным индекс, хотя ... –

+0

cplusplus.com известен тем, что полон ошибок. Ссылка на Apad stdlib выше. –

1

Другой очевидной проблемой, которая нуждается в указывая:

int main() 
{ 
    system("pause"); 
    return 0; 
    primer(1000); 
} 

Ваша функция никогда не будет называться. Ваше приложение выйдет, когда основные возвращаются.

+0

XD Не беспокойтесь. Как только я увидел ошибку, я мог бы быстро ее исправить. – TimeCoder

+1

Это полезно знать! Но это нужно было сказать ... Я не могу с собой поделать. –

+0

Вау, я полностью пропустил 'main()'. Я был настолько сосредоточен на всех проблемах с 'primer()'. – chrisaycock

2
for(int ii = 0; ii < a.size(); ++ii) 

C и C++ индексы массивов начинаются с нуля и заканчиваются в размере-1, так что вам нужно сравнить менее чем, не менее чем или равный к. вектор следует тому же правилу.

1
a[#a+1]=i; 

изменилось использовать размер() становится:

a[ a.size() + 1 ] = i; 

Это синтаксически правильный, но гарантированно не так. Это должно быть:

a.push_back(i); 

Прочитать API, на который ссылается Оли.

+0

На самом деле cplusplus.com известен своими ошибками. Ссылка на Apad stdlib выше. –

+0

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