2016-09-15 4 views
1

В настоящее время я пытаюсь получить «вариационные функции» и просто пытаюсь загрузить 4 имени в вектор-строке, а затем распечатать их. Когда я делаю это с помощью типа «int» и использую числа, он работает нормально, но когда я использую вектор строки, я получаю ошибку.Ошибка «векторного индекса за пределами диапазона»

#include "stdafx.h" 
#include<cstdio> 
#include<cstdarg> 
#include<string> 
#include<vector> 
#include<iostream> 
using namespace std; 



int count; 

vector<string> namesVector; 

void names(int count, ...) 
{ 
    va_list namesList; 

    int i; // for loop 

    va_start(namesList, count); 

    for (i = 0; i < count; i++) 
    { 
     string currentElement; 
     currentElement = va_arg(namesList, string); 

     namesVector[i] = currentElement; 

    } 

    va_end(namesList); 
} 


int main() 
{ 
    int nameCount = 4; 

    names(nameCount,"jon", "maggie", "joan", "alfred"); 

    for (int i = 0; i < nameCount; i++) 
    { 
     cout << "Name at element " << i << " is: " << namesVector[i] << endl; 
    } 

} 
+1

Это звучит, как вы, возможно, потребуется, чтобы узнать, как использовать отладчик для пошагового кода. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** –

+0

Я предлагаю вам провести некоторое время [чтение о том, как работает 'std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). – caps

ответ

3

C++ позволяет использовать только типы с возможностью копирования в виде вариационных аргументов. Поскольку std::string является конструктивным из указателя char*, который указывает на буфер с нулевым завершением, вы можете использовать char* вместо std::string. Просто замените

currentElement = va_arg(namesList, string); 

с

currentElement = va_arg(namesList, char*); 

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

Ваш код также содержит ошибку времени выполнения. Это:

namesVector[i] = currentElement; 

, вероятно, сбой вашей программы, поскольку вы не выделяли какую-либо память в векторе. Векторы на самом деле являются динамическими массивами, поэтому вы должны либо передать аргумент размера соответствующему конструктору, либо вызвать resize на вектор. В случае, если вы вы можете сделать ни один из него, а просто использовать push_back method:

namesVector.push_back(currentElement); 
+0

Большое спасибо! Это исправило это и спасибо за объяснение! – JSan782