Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

C++ Взимане на брой елементи от вектор

Featured Replies

Здравейте,

В момента имам сериозен проблем със взимането на броят на елементи в даден вектор.

vec.size();

и  

sizeof(vec) / sizeof(vec[0]);

не работят. Програмата те пита за брой ключове за даден тест, въвеждаш ключовете, после въвеждаш и отговорите, които са били дадени, и програмата ги сравнява и в зависимост от това колко верни отговори имаш ти дава точки. Ключовете и дадените отговори са тип char. ("A", "B", "C" etc.)
Ето го и кода, като повечето съм го направил на коментар за да си тествам само функцията която извежда броя на елементите.

#include "stdafx.h"
#include <iostream>
#include <vector>

#define CONSOLE_LOG(x) std::cout << x;

std::vector<char> keys = {'A', 'B', 'C', 'D', 'E'};
std::vector<char> studentAnswers;

int n, points = 0;
char key, answer;

template <typename T>
T vecSize(std::vector<T>& vec) 
{ 
	T size = vec.size(); 
	return size; 
}
/*
template <typename T1>
void enterKeys(std::vector<T1>& k)
{
	CONSOLE_LOG("Please enter the number of keys: ");
	std::cin >> n;

	for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++)
	{
		CONSOLE_LOG("Key " << counter << ": ");
		std::cin >> key;
		k.emplace_back(key);
	}
}

template <typename T2>
void enterAnswers(std::vector<T2>& stAns)
{
	for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++)
	{
		CONSOLE_LOG("Answer " << counter << ": ");
		std::cin >> answer;
		stAns.emplace_back(answer);
	}
}

template <typename T3>
void getGrade(std::vector<T3>& x, std::vector<T3>& y)
{
	for (int i = 0; i < n; i++) { if (x[i] == y[i]) { points++; } }
	CONSOLE_LOG("Points: " << points);
}
*/
int main()
{
	/*
	enterKeys(keys);
	enterAnswers(studentAnswers);

	getGrade(studentAnswers, keys);
	*/

	std::cout << keys.size() << std::endl;
	std::cout << vecSize(keys) << std::endl;

	std::cin.get(); std::cin.get(); std::cin.get();
	return 0;
}

Опитах всевъзможни начини, и пак не става. Идеята е да заместя n променливата със броя на елементите от вектора. Програмата върви по един и същи начин, защото все пак в n променливата запазваме големината на вектора, но бих искал да си го направя с функция.
Както виждате на края на програмата си извеждам тестове. Първият, който си е по конвенционалният метод си работи сам по себе си, но пък във for цикъл не бачка.
А вторият е функцията която съм направил. Проблемът е че ми извежда непознат символ - "�"
Проблемът е че типът на елементите във вектора е char, защото като го направих с int тип си работеше както трябва.

Бих бил изключително благодарен ако някой може да ме насочи и да ми бутне едно рамо :)

Пишеш неща, които не разбираш.

Някой ти е казал да ги пишеш така?

template <typename T>
T vecSize(std::vector<T>& vec) 
{ 
    T size = vec.size(); 
    return size; 
}

T - тип на елемент от вектора.

vector<char> vec = { 'A', 'B', 'C' };
vecSize(vec);
 
template<>
char vecSize(std::vector<char> &vec)
{
    char size = vec.size();
    return size;
}

Сега виждаш ли тъпотията, която си написал?

  • Автор

Да, видях я. Въпросът е че изходът на програмата е същият, не се е оправил.

По принцип разбирам какво пиша, иначе няма да го пиша, обаче отчаянието си каза думата и почнах да пробвам всевъзможни начини, независимо че имам прекалено основни и недостатъчни знания за темплейтите.

Той няма да се оправи, защото ти така си написал програмата. Опитваш се да принтираш символа 5, последни ASCII таблицата и ще видиш, че той няма репрезентация. Не виждам смисъл да го правиш с template, но правилният запис е

template <typename T>
size_t vecSize(const std::vector<T>& vec) 
{ 
    size_t size = vec.size(); 
    return size; 
}

 

  • Автор

 

на 8.06.2018 г. в 7:01, bvbfan написа:

Той няма да се оправи, защото ти така си написал програмата. Опитваш се да принтираш символа 5, последни ASCII таблицата и ще видиш, че той няма репрезентация. Не виждам смисъл да го правиш с template, но правилният запис е


template <typename T>
size_t vecSize(const std::vector<T>& vec) 
{ 
    size_t size = vec.size(); 
    return size; 
}

 


Мерси много, работи, но самата функция която исках да направя не работи както трябва, и се сетих защо.

Затова си оправих проблема по следният начин: Очевидно големината на вектора се променя, затова направих функция която ми копира елементите от вектора във масив, и после си направих функция която пък ми извежда големината на масива.

И това си работи идеално, но пък имам друг проблем. Ето го кода:

#include "stdafx.h"
#include <iostream>
#include <vector>

#define CONSOLE_LOG(x) std::cout << x;

std::vector<char> keys;
std::vector<char> studentAnswers;
std::vector<char>::const_iterator iter;

int n, points = 0;
char key, answer;
char* keyArray = new char[n];

template <typename T>
void copyVecToArr(std::vector<T>& vec, T arr[])
{
	for (int i = 0; i < vec.size(); i++)
	{
		arr[i] = vec[i];
	}
}

template <typename T1>
size_t arrSize(T1 arr[])
{ return (sizeof(arr) / sizeof(arr[0])); }

template <typename T2>
void enterKeys(std::vector<T2>& vec)
{
	CONSOLE_LOG("Please enter the number of keys: ");
	std::cin >> n;
	keys.resize(n);
	copyVecToArr(keys, keyArray);

	for (int i = 0, counter = 1; i < arrSize(keyArray), counter <= arrSize(keyArray); i++, counter++)
	{
		CONSOLE_LOG("Key " << counter << ": ");
		std::cin >> key;
		vec.emplace_back(key);
	}
}

template <typename T3>
void enterAnswers(std::vector<T3>& vec)
{
	for (int i = 0, counter = 1; i < arrSize(keyArray), counter <= arrSize(keyArray); i++, counter++)
	{
		CONSOLE_LOG("Answer " << counter << ": ");
		std::cin >> answer;
		vec.emplace_back(answer);
	}
}

template <typename T4>
void getGrade(std::vector<T4>& x, std::vector<T4>& y)
{
	for (int i = 0; i < arrSize(keyArray); i++) { if (x[i] == y[i]) { points++; } }
	CONSOLE_LOG("Points: " << points);
}

int main()
{
	enterKeys(keys);
	enterAnswers(studentAnswers);

	getGrade(studentAnswers, keys);

	std::cin.get();
	return 0;
}

Знам че в момента изпълнението няма да е много бързо, но паметта после ще я оправям, за сега искам да си оправя проблемът.
Всичко си работи идеално, освен последната ми функция getGrades.
Извежда ми points: 0, въпреки че входните ми данни са еднакви, и трябва ако съм въвел брой на елементите 4, и входните ми данни са еднакви, тогава points ще да е 4.
Някаква идея? Сигурно е нещо много елементарно и глупаво, може и да не е, но го гледах и гледах, не мога да намеря проблема. Тествах, дебъгвах, нищо.
Тестове много направих. Записва си ми входните данни във векторите, но там където се прави сравнението във фор цикълът, там ми е проблема, а не разбирам защо е така.

Меко казано - пишеш глупости. Седни и прочети, хаотичен код.

template <typename T1>
size_t arrSize(T1 arr[])
{ return (sizeof(arr) / sizeof(arr[0])); }

Това няма да ти върне размера на масива, arr[] е указател, еквивалентен запис е arr*. Друга техника се ползва за вземането на размера на масив, но не виждам смисъл да ти е казвам, първо разбери какво пишеш, и изглежда като напълно случайно изфабрикуван.

  • Автор

Ами така съм чел, така са ме учили - така пиша.
Няма нужда от обиждане, при положение че не съм аз виновен. Седнал ли съм да го търся в интернет - седнал съм. Така пише, така съм го научил.

  • Автор

И в интерес на истината - отговорът ти не е много умен, при положение че аз питам едно, а последвалият отговор касае съвсем друго нещо, което всъщност си работи. Този метод за взимане на размера на масива си работи.
Въпросът ми беше защо points винаги ми извежда 0.

  • Автор

E, какво пак. Окей, разбрах че не работи, това ми е ясно. Единствено ти казах, че така съм чел и така са ме учили.
Въпросът е, щом това не е правилният метод, кой е тогава?

П.П Не искам да използвам array библиотеката, защото до колкото знам там задължително трябва да имам големина на масива от самото дефиниране.

Дължина на вектор само викаш size() (или това, което аз съм написал), дължина на масив

template <typename T, size_t N>
size_t len(T (&array)[N])
{
    return N;
}

По твоят начин се прави с дефиниция

#define size(x)	sizeof(x)/sizeof(x[0])

Но трябва да си сигурен, че подаваш масив, а не указател, докато горната функция ще изгърми и ще ти каже, че си я викнал с указател.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.