Ваше решение прекрасно, но можно использовать итератор, чтобы сделать это:
std::map<int, int> m;
m.insert(std::pair<int, int>(3, 4));
m.insert(std::pair<int, int>(5, 6));
for(std::map<int, int>::const_iterator it = m.begin(); it != m.end(); it++)
{
int key = it->first;
int value = it->second;
//Do something
}
] Должен ли быть bash? Вы можете использовать двоичный файл GNU coreutils / bin / date
для многих преобразований:
$ date --date="2009-01-02 03:04:05" "+%d %B of %Y at %H:%M and %S seconds"
02 January of 2009 at 03:04 and 05 seconds
Это анализирует заданную дату и отображает ее в выбранном формате. Вы можете адаптировать это к своим потребностям.
Pure Bash:
date="2009-12-03 15:35:11"
saveIFS="$IFS"
IFS="- :"
date=($date)
IFS="$saveIFS"
for field in "${date[@]}"
do
echo $field
done
2009
12
03
15
35
11
$ t='2009-12-03 12:38:15'
$ a=(`echo $t | sed -e 's/[:-]/ /g'`)
$ echo ${a[*]}
2009 12 03 12 38 15
$ echo ${a[3]}
12
еще один чистый bash
$ d="2009-12-03 15:35:11"
$ d=${d//[- :]/|}
$ IFS="|"
$ set -- $d
$ echo $1
2009
$ echo $2
12
$ echo $@
2009 12 03 15 35 11
вы пробовали использовать вырезать?
что-то вроде этого:
dayofweek = date | cut -d "" -f1
Это просто, просто преобразуйте тире и двоеточия в пробел (нет необходимости изменять IFS) и используйте «читать» все в одной строке:
read Y M D h m s <<< ${date//[-:]/ }
Например:
$ date=$(date +'%Y-%m-%d %H:%M:%S')
$ read Y M D h m s <<< ${date//[-: ]/ }
$ echo "Y=$Y, m=$m"
Y=2009, m=57
Метод массива, возможно, лучше, но это то, о чем вы конкретно просили:
IFS=" :-"
read year month day hour minute second < <(echo "YYYY-MM-DD hh:mm:ss")
вместо использования сценария оболочки, включите в свой сценарий сам, как показано ниже, когда вам нужно:
a=date +%Y
b=date +%S
c=date +%H
a будет год b будет секунд c будут часы. и т. д.