2

標準入力から文字列を読み取り、いくつかの操作を実行する必要があります。その間に、入力の一部をchar配列にコピーする必要があります。C ++では、次のように実行できます。

scanf("%s", &array[pos]);

文字列を位置のscharにコピーします。私はこれを非常に迅速に行う必要があります(オリンピックのタスク)。C++での1つの大きな読み取りには5秒かかりました。C#では、ループを使用して配列にコピーしようとしましたが、70秒かかりました。これは長すぎます。また、string.ToCharArray()を使用するよりも、1つの大きな文字列を作成することはお勧めできません。それを行う方法はありますか?arrayposstring.elementAt()

char[] ciag = new char[1010001];
for(int x = 0 ; x < n ; x++){
line = Console.ReadLine();
sekw[x] = poz;
len = int.Parse(line.Split(' ')[0]);  //length of string to copy
string znaki = line.Split(' ')[1];    //copied string
for (int j = 0; j < len; j++)
{
ciag[poz + j] = znaki[j];  //put into array. Perhaps slow.
}
poz += len;
ciag[poz++] = 'k';  //my stuff
}
4

6 に答える 6

4
public void CopyTo(
    int sourceIndex,
    char[] destination,
    int destinationIndex,
    int count
)
于 2012-08-08T12:15:15.417 に答える
0

試す:

char[] c = new char[stringa.Length];   

for(int i = 0;i<stringa.Length;i++){
     c[i] = stringa[i];
}

ただし、パフォーマンスが向上するかどうかはわかりません。必要なものを明確に説明することは本当に役に立ちますが

于 2012-08-08T12:01:25.403 に答える
0

これを使って:

using (Stream stdin = Console.OpenStandardInput())
{
    byte[] buffer = new byte[1024];
    stdin.Read(buffer, 0, buffer.Length);
    char[] inputCharArray = System.Text.Encoding.Default.GetChars(buffer);
}
于 2012-08-08T12:17:01.353 に答える
0

を使用しStringBuilderます。

このコードは、約1秒で100x10000文字を処理します。より速く必要な場合は、TPLを使用してタスクを並列化できます-名前空間からのタスク並列ライブラリ:System.Threading.Tasks

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char[] input = CreateInput();
            DateTime start = DateTime.Now;
            for (int i = 1; i < 100; i++)
            {
                StringCutter(new String(input));
            }
            Console.WriteLine((DateTime.Now - start).ToString());
            Console.ReadKey();
        }

        private static char[] CreateInput()
        {
            const int len = 10000;
            char[] ret = new char[len];
            for (int i = 0; i < len; i++)
            {
                ret[i] = Convert.ToChar(i % 256);
            }
            return ret;
        }

        private static String StringCutter(String str)
        {
            List<char> exclusion = new List<char> { 'A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u' };
            StringBuilder result = new StringBuilder(str);
            for (int i = 0; i < result.Length; i++)
            {
                if (!(exclusion.Contains(result[i])))
                {
                    result.Remove(i, 1);
                    i--;
                }
            }
            return result.ToString();
        }
    }
}
于 2012-08-08T12:24:36.567 に答える
0
for (int x = 0; x < n; x++)
        {
            line = Console.ReadLine();
            sekw[x] = poz;
            len = int.Parse(line.Split(' ')[0]);
            char[] temp = line.Split(' ')[1].ToCharArray();
            **Array.Copy(temp, 0, ciag, poz, temp.Length);** 
            poz += len;
            ciag[poz++] = 'k';
        }
于 2012-08-09T08:51:36.290 に答える
0

あなたができる

char[] Words = "Exemple string test".ToCharArray();

char[] Words = Console.ReadLine().ToCharArray();

于 2018-12-13T21:44:52.057 に答える