C ++ এ স্ট্রিংগুলির অ্যারে কীভাবে ঘোষণা করবেন?


89

আমি স্ট্যাটিক অ্যারেগুলির সমস্ত উপাদানগুলিকে সর্বোত্তম পদ্ধতিতে পুনরাবৃত্তি করার চেষ্টা করছি। আমি এটি একটি লাইনে ঘোষণা করতে সক্ষম হতে চাই এবং সংখ্যার সন্ধান না করে সহজেই এ থেকে উপাদানগুলি যুক্ত / সরান। খুব সহজ লাগছে তাই না?

সম্ভাব্য অ-সমাধান:

vector<string> v;
v.push_back("abc");
b.push_back("xyz");

for(int i = 0; i < v.size(); i++)
    cout << v[i] << endl;

সমস্যা - স্ট্রিংয়ের তালিকা সহ এক লাইনে ভেক্টর তৈরি করার কোনও উপায় নেই

সম্ভাব্য অ-সমাধান 2:

string list[] = {"abc", "xyz"};

সমস্যা - স্বয়ংক্রিয়ভাবে স্ট্রিংয়ের সংখ্যা পাওয়ার কোনও উপায় নেই (যা আমি জানি)।

এটি করার একটি সহজ উপায় থাকতে হবে।


বুস্ট বরাদ্দ গ্রন্থাগার হতে আপনি ঠিক যা খুঁজছি হয় বলে মনে হয়। এটি কনটেইনারগুলিকে পূর্বের চেয়ে সহজতরকরণকে সহজ করে তোলে।
ক্রেগ এইচ

উত্তর:


108

সি ++ 11 নীচের সিনট্যাক্সটি অনুমোদনের জন্য প্রাথমিক সূচনা তালিকা যুক্ত করেছেন:

std::vector<std::string> v = {"Hello", "World"};

এই সি ++ 11 বৈশিষ্ট্যটির জন্য সমর্থনটি কমপক্ষে জিসিসি 4.4 এবং কেবলমাত্র ভিজ্যুয়াল স্টুডিও 2013 এ যুক্ত করা হয়েছিল


2018. সবেমাত্র সি ++ শুরু করেছেন এবং নমনীয় অ্যারে সম্পর্কিত বেশ কিছু গবেষণা করেছেন। কেবল ভেক্টর ব্যবহার করে শেষ হয়েছে ...
রবার্ট মোলিনা

37

আপনি সংক্ষিপ্তভাবে vector<string>একটি স্ট্যাটিকালি-তৈরি char*অ্যারে থেকে একটি সূচনা করতে পারেন :

char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);

এটি সমস্ত স্ট্রিংগুলি অনুলিপি করে, সুতরাং আপনি দ্বিগুণ মেমরি ব্যবহার করেন। আপনি উইলের ডিনের পরামর্শটি এখানে যাদু নম্বর 3 টি অ্যারেজাইজ (টিআর_আরে) দিয়ে প্রতিস্থাপন করতে ব্যবহার করতে পারেন - যদিও আমার মনে আছে কিছু বিশেষ ক্ষেত্রে রয়েছে যাতে অ্যারেজাইজের সেই বিশেষ সংস্করণটি কিছু খারাপ করতে পারে (দুঃখিত আমি তাত্ক্ষণিক বিশদটি মনে করতে পারি না) । তবে এটি প্রায়শই সঠিকভাবে কাজ করে।

এছাড়াও, যদি আপনি সত্যিই এক লাইনের জিনিসকে গুং-হো করেন তবে আপনি একটি বৈকল্পিক ম্যাক্রো সংজ্ঞায়িত করতে পারেন যাতে একটি একক লাইন যেমন DEFINE_STR_VEC(strvector, "hi", "there", "everyone");কাজ করে।


যেহেতু strarrayশিরোনামে রয়েছে তাই এটি কী এক সংজ্ঞা বিধি লঙ্ঘন করবে না?
jw

22

সমস্যা - স্বয়ংক্রিয়ভাবে স্ট্রিংয়ের সংখ্যা পাওয়ার কোনও উপায় নেই (যা আমি জানি)।

এটি করার একটি জাল-স্ট্যান্ডার্ড পদ্ধতি রয়েছে, যা প্রচুর লোক (এমএস সহ) ম্যাক্রোগুলিকে পছন্দ arraysizeকরে:

#define arraysize(ar)  (sizeof(ar) / sizeof(ar[0]))

4
বিকল্পভাবে, কেউ এরকম কিছু ব্যবহার করতে পারে: template<typename T, size_t N> inline size_t arraysize(T (&ar)[N]) { return N; } (ইনলাইন কীওয়ার্ডটি প্রয়োজনীয় নয়, তবে ফাংশনটির অভিপ্রায়টি নথিভুক্ত করার জন্য ব্যবহৃত হয়েছিল I একটি আধুনিক সংকলক তাত্ত্বিকভাবে পুরো ফাংশনটি ফিরিয়ে দিতে সক্ষম হবে, আমি বিশ্বাস করি
জাস্টিন টাইম - মনিকা

4
এটি পয়েন্টারগুলির জন্য ব্যর্থ। C ++ এ অ্যারে উপাদান গণনা করা অন্যভাবে করা উচিত।
jw

8

C ++ এ এভাবে স্ট্রিংগুলির অ্যারে ঘোষণা করুন: char array_of_strings[][]

উদাহরণ স্বরূপ : char array_of_strings[200][8192];

200 টি স্ট্রিং থাকবে, প্রতিটি স্ট্রিং 8kb বা 8192 বাইট সাইজের থাকবে।

strcpy(line[i],tempBuffer); স্ট্রিংগুলির অ্যারেতে ডেটা রাখতে ব্যবহার করুন ।


এফওয়াইআই, চর অ্যারে_এফ_স্ট্রিংস [] [] সি ++ স্ট্রিং গ্রহণ করতে পারে না, প্রথমে চরকে রূপান্তর করতে ভুলবেন না। cplusplus.com/reference/string/string/c_str
Luqmaan

যেহেতু array_of_stringsশিরোনামে রয়েছে তাই এটি কী এক সংজ্ঞা বিধি লঙ্ঘন করবে না?
jw

7

একটি সম্ভাব্যতা হ'ল পতাকা মান হিসাবে একটি NULL পয়েন্টার ব্যবহার:

const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
    cout << *iList;
}

চর ** এর অর্থ কী? জাভাতে, এটি স্ট্রিংগুলির একটি তালিকা হবে?
আইএএমগ্রুট

4
@ ডুমস্কাইট: এই ক্ষেত্রে, হ্যাঁ। প্রথম লাইনে আমি একটি অ্যারে সংজ্ঞায়িত করি char*। স্মৃতিতে, এটি 3 পয়েন্টার হিসাবে প্রকাশিত হয় - "কুকুর" এর একটি পয়েন্ট, "বিড়াল" এবং একটিতে NULL থাকে। আমি সেই প্রথম পয়েন্টারে একটি পয়েন্টার নিতে পারি এবং একটি পেতে পারি char**- একটি পয়েন্টার থেকে চরে char আমি যখন এটি বাড়িয়েছি, আমি তালিকাটির পরবর্তী আইটেমটির দিকে নির্দেশ করতে চর ** সরান - পয়েন্টারটির পয়েন্টার যা "বিড়াল" এর দিকে নির্দেশ করে, তারপরে আমি আবার বৃদ্ধি করি, এবং একটি পয়েন্টার পাই যা NULL পয়েন্টারকে নির্দেশ করে এবং আমি জানি আমি সম্পন্ন করেছি (
11:58

4

আপনি বুস্ট রেঞ্জের লাইব্রেরি থেকে আদিম অ্যারের শেষগুলি সহজেই সন্ধান করতে beginএবং endফাংশনগুলি ব্যবহার করতে পারেন এবং ম্যাক্রো সমাধানের বিপরীতে, আপনি যদি ভুলবশত কোনও পয়েন্টারে এটি প্রয়োগ করেন তবে ভাঙা আচরণের পরিবর্তে এটি একটি সংকলন ত্রুটি দেয়।

const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));

3

আপনি উইলের ডিনের পরামর্শটি [ #define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))] ব্যবহার করে এখানে 3 নম্বর যাদুটিকে অ্যারেজাইজ (টিআর_আরে) দিয়ে প্রতিস্থাপন করতে পারেন - যদিও আমার মনে আছে কিছু বিশেষ ক্ষেত্রে রয়েছে যাতে অ্যারেজির নির্দিষ্ট সংস্করণটি কিছু খারাপ করতে পারে (দুঃখিত আমি বিশদটি মনে করতে পারি না) অবিলম্বে)। তবে এটি প্রায়শই সঠিকভাবে কাজ করে।

ক্ষেত্রে যখন এটি কাজ করে না তখন যখন "অ্যারে" সত্যই ঠিক পয়েন্টার হয়, প্রকৃত অ্যারে হয় না। এছাড়াও, অ্যারেগুলি যেভাবে ফাংশনে স্থানান্তরিত হয় (প্রথম উপাদানটিতে পয়েন্টারে রূপান্তরিত হয়) এর কারণে, স্বাক্ষরটি অ্যারের মতো দেখায় এমনকি এটি ফাংশন কলগুলিতে কাজ করে না - some_function(string parameter[])সত্যই some_function(string *parameter)


3

এখানে একটি উদাহরণ:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

int main() {
    const char* const list[] = {"zip", "zam", "bam"};
    const size_t len = sizeof(list) / sizeof(list[0]);

    for (size_t i = 0; i < len; ++i)
        std::cout << list[i] << "\n";

    const std::vector<string> v(list, list + len);
    std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n"));
}

2

Ma ম্যাক্রোর পরিবর্তে, আমি কি এটির পরামর্শ দিতে পারি:

template<typename T, int N>
inline size_t array_size(T(&)[N])
{
    return N;
}

#define ARRAY_SIZE(X)   (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)

1) আমরা এটিকে একটি সংকলন-সময় স্থির করতে ম্যাক্রো ব্যবহার করতে চাই; ফাংশন কলের ফলাফল কোনও সংকলন-ধ্রুবক নয়।

2) তবে আমরা ম্যাক্রো ব্যবহার করতে চাই না কারণ ম্যাক্রোটি ঘটনাক্রমে কোনও পয়েন্টারে ব্যবহার করা যেতে পারে। ফাংশনটি কেবল সংকলন-সময় অ্যারে ব্যবহার করা যেতে পারে।

সুতরাং, আমরা ম্যাক্রোটিকে "নিরাপদ" করতে ফাংশনের সংজ্ঞায়িত-নেস ব্যবহার করি; যদি ফাংশনটি বিদ্যমান থাকে (যেমন এটির শূন্য-আকার না থাকে) তবে আমরা উপরের মতো ম্যাক্রোটি ব্যবহার করি। যদি ফাংশনটি না থাকে তবে আমরা একটি খারাপ মান ফিরিয়ে দেব।


2
#include <boost/foreach.hpp>

const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
    cout << str << endl;
}

1
#include <iostream>
#include <string>
#include <vector>
#include <boost/assign/list_of.hpp>

int main()
{
    const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" );
    std::copy(
        v.begin(),
        v.end(),
        std::ostream_iterator< std::string >( std::cout, "\n" ) );
}

1

আপনি সরাসরি স্ট্রিংগুলির একটি অ্যারে ঘোষণা করতে পারেন string s[100];। তারপরে আপনি যদি নির্দিষ্ট উপাদানগুলিতে অ্যাক্সেস করতে চান তবে আপনি এটি সরাসরি পছন্দ করতে পারেন s[2][90]। পুনরাবৃত্তির উদ্দেশ্যে, s[i].size()ফাংশনটি ব্যবহার করে স্ট্রিংয়ের আকার নিন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.